mysql - 在多个一对多表上的 Mysql 上获取 group by 数据时出现问题

标签 mysql sql

目前我们有三张 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_concatgroup 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/

相关文章:

java - 在表中搜索

php - mySQL 选择访问并按月显示所有?

mysql - 将 MySQL 数据从 Yes/No varchar 迁移到位字段

php - Magento 按十进制而不是字母数字排序属性

SQL:按日期顺序订购 Month_year

mysql - 如何计算 3 个不同表格之间的利润

PHP MYSQL 列数据下拉列表

c# - 使用 MysqlConnector 从 C# 应用程序执行 MySql 存储过程很慢?

MySQL 连接提示输入密码,即使它在连接字符串中

mysql - 高 table 中的兰德