目前我们有三张 table
用户(用于存储基本信息)
- id -> PK
- 名字 -> 索引
- 姓氏 -> 索引
此表中还有更多字段,通常用于过滤数据
user_titles(这是与表 A 一对多的关系表。我们通常用它来存储表 A 上用户的头衔。单个用户可以拥有多个头衔)可以是主要的,也可以是另一个 中学)
- ID
- user_id(FK 到表 A)
- title_id(FK 到标题表,我们存储所有标题名称)
- is_primary(enum->'主要','次要')
user_speciality(表与用户表是一对多关系,我们在其中存储用户的主要专业和附加专业)
- id -> PK
- user_id ->(FK,引用用户表)
- specialty_id ->(FK,引用我们存储专业信息的专业表)
- is_primary ->(枚举 ->'primary','secondary')
上面是我们的表格结构,在搜索时我们必须列出具有所选专业和头衔的所有用户。
基于此表结构,我们将获取如下查询的数据
> SELECT `user_titles`.`title_id`,`user_titles`.`is_primary`,`user_speciality`.`speciality_id`,`user_speciality`.`is_primary`,`users`.`firstname`,`users`.`lastname`FROM `users`, `user_titles`,`user_speciality` where `user_speciality`.`user_id`=`users`.`id` and `user_titles`.`user_id`=`users`.`id`
但是,当我们列出数据时,如果用户具有次要头衔或专业,我们会为用户获取多行。基本上我需要以下格式的数据。
当我们使用 group_concat 上述查询时,我们收到一条错误,指出 group_concat
或 group by
不可能。
user_id, title_id(primary), title_ids(secondary titles with comma seperated), user.firstname, user.lastname, speciality_id(primary), specialty_id(secondary id's with comma separated)
如果我们将标题和专业 ID 存储在用户表中并使用逗号分隔值并编写类似查询,我们可以轻松获得此结构,但我们拥有大量数据,并且对这些一堆类似查询的性能表示怀疑数据。
请指导我们解决问题。
最佳答案
切勿在FROM
子句中使用逗号。 始终使用正确、明确、标准 JOIN
语法。
也就是说,您想要的是聚合。特别是,您可以使用条件聚合执行您想要的操作:
SELECT u.*,
MAX(CASE WHEN ut.is_primary THEN ut.title_id END) as primary_title,
GROUP_CONCAT(DISTINCT CASE WHEN NOT ut.is_primary THEN ut.title_id END) as secondary_titles,
MAX(CASE WHEN us.is_primary THEN us.speciality_id END) as primary_specialty,
GROUP_CONCAT(DISTINCT CASE WHEN NOT us.is_primary THEN us.speciality_id END) as secondary_specialties
FROM `users` u LEFT JOIN
`user_titles` ut
ON ut.user_id = u.id LEFT JOIN
`user_speciality` us
ON us.`user_id`= u.`id`
GROUP BY u.id;
关于mysql - 在多个一对多表上的 Mysql 上获取 group by 数据时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56546746/