php - 具有多对多关系的Mysql group_concat

标签 php mysql sql

我有三张 table

+-------------+  +-----------------------------+  +-----------+
| WORKSPACES  |  | USERS_WORKSPACES            |  | USERS     |
+-----+-------+  +----+---------+--------------+  +----+------+
| id  | title |  | id | user_id | workspace_id |  | id | name |
+-----+-------+  +----+---------+--------------+  +----+------+
|  1  |  W1   |  | 1  |   1     |     1        |  |  1 |  U1  |
|  2  |  W2   |  | 2  |   1     |     2        |  |  2 |  U2  |
|  3  |  W3   |  | 3  |   2     |     2        |  |  3 |  U3  |
+-----+-------+  +----+---------+--------------+  +----+------+

我正在尝试查询数据库以列出给定 user_id 的唯一工作区。对于返回的每个工作区,我想要一组唯一的用户 ID。像这样:

对于 user_id = 2

+--------------+-----------------+-------+
| workspace_id | workspace_title | users |
+----------------------------------------+
| 1            | W1              | 1     |
+----------------------------------------+
| 2            | W2              | 1,2   |
+----------------------------------------+

对于 user_id = 2

+--------------+-----------------+-------+
| workspace_id | workspace_title | users |
+----------------------------------------+
| 2            | W2              | 1,2   |
+----------------------------------------+

通过这个查询,我可以列出所有工作区的唯一用户 ID。如何将列表限制为仅与指定 user_id 关联的工作区?

SELECT w.id,
       w.title,
       group_concat(b.user_id) as users
FROM   workspaces w, 
       users_workspaces b,
       users u
WHERE  w.id = b.workspace_id 
  AND  b.user_id = u.id
GROUP BY w.id

最佳答案

您的查询在功能上看起来是正确的。但是,您不需要加入users 表,因为您可以从users_workspaces 中获取user_id。并且,您应该使用正确的连接语法:

select w.id, w.title, group_concat(uw.user_id) as users
from workspaces w join 
     users_workspaces uw
     on w.id = uw.workspace_id 
group by w.id;

如果您想将其限制在与特定用户 ID 关联的工作区,则使用 having 子句:

select w.id, w.title, group_concat(uw.user_id) as users
from workspaces w join 
     users_workspaces uw
     on w.id = uw.workspace_id 
group by w.id
having sum(uw.user_id = @USERID) > 0;

关于php - 具有多对多关系的Mysql group_concat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23389828/

相关文章:

php - 如何将动态生成的表单不同字段值存储回数据库php mysql?

php - Laravel 关系

php - 当您只插入几行时,MySQL 中的单个多个 INSERT 是否会在速度上产生很大差异?

java - 尝试从 Mysql 数据库获取数据(Spring Boot + Vaadin)

python - Python 中的 MySQL LOAD DATA INFILE 无法使用变量

mysql - 如何在 R 的 sqlQuery 函数中使用 REGEXP

javascript - 如何在网站中实现 whatsapp 分享按钮

PHP sql注入(inject)和函数中参数的自定义数量

sql - 用户事件的数据库结构是否正确?

sql - SQL Server 中的计数除以计数(*)