mysql - 修复连接的多对多 MySQL 查询

标签 mysql sql join many-to-many

我有两个表格,如下所示:

表A:

+-----+-----+------+-------+
| aID | uID | attr | value |
+-----+-----+------+-------+
| 1   | 1   | fn   | john  |
+-----+-----+------+-------+
| 2   | 1   | ln   | smith |
+-----+-----+------+-------+
| 3   | 2   | fn   | jim   |
+-----+-----+------+-------+
| 4   | 2   | ln   | bean  |
+-----+-----+------+-------+

表 B:

+-----+-----+-------+-------+
| bID | uID | perm  | value |
+-----+-----+-------+-------+
| 1   | 1   | admin | 1     |
+-----+-----+-------+-------+
| 2   | 2   | news  | 1     |
+-----+-----+-------+-------+
| 3   | 2   | cms   | 1     |
+-----+-----+-------+-------+

如图所示,表A保存了用户uID的属性数据,表B保存了用户的权限数据uID.

目前,我正在使用:

SELECT GROUP_CONCAT(`a`.`attr`) AS `attrs`
     , GROUP_CONCAT(`a`.`value`) AS `values`
     , GROUP_CONCAT(`b`.`perm`) AS `perms` 
FROM `a` 
JOIN `b` 
ON `a`.`uID` = `b`.`uID` 
GROUP BY `a`.`uID`, `b`.`uID`

但它给了我一个结果:

+-------------+-------------------+-------------------+
| attrs       | values            | perms             |
+-------------+-------------------+-------------------+
| fn,ln       | John,Smith        | admin,admin       |
+-------------+-------------------+-------------------+
| fn,fn,ln,ln | Jim,Jim,Bean,Bean | news,cms,news,cms |
+-------------+-------------------+-------------------+

我需要在查询中更改什么才能获得:

+-------+------------+----------+
| attrs | values     | perms    |
+-------+------------+----------+
| fn,ln | John,Smith | admin    |
+-------+------------+----------+
| fn,fn | Jim,Bean   | news,cms |
+-------+------------+----------+

最佳答案

GROUP_CONCAT 接受额外的参数,如其文档页面 here 中所述.

你想要的是distinct:

SELECT GROUP_CONCAT(distinct `a`.`attr`) AS `attrs` . . .

关于mysql - 修复连接的多对多 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13958788/

相关文章:

mysql - 在另一个过程中使用事务调用两个不同的过程

linux - Bash脚本通过相似的字段加入两个csv文件并输出到第三个字段

mysql递归自连接相交列

lua - torch/nn - 按元素连接张量数组

mysql - 数据库资源管理器未看到 MySQL J Connect "Unable to find JDBC driver file on MATLAB Java class path"

php - 可捕获的 fatal error : Object of class stdClass could not be converted to string

MySQL 查询,3 个表,t1-t2 然后更新 t3。我怎样才能以最有效的方式做到这一点?

sql - 我如何执行这个简单的 SQL SELECT 语句?

sql - 如何检查数据库中是否存在 View ?

mysql - 在单个查询中获取不同日期范围的多列计数