【发布时间】:2021-04-23 22:50:45
【问题描述】:
我有 3 张桌子:
角色:
| id | name | user_id |
|---|---|---|
| 1 | president | 1 |
| 2 | chief | 1 |
| 3 | caporal | 1 |
| 4 | president | 2 |
| 5 | caporal | 3 |
组:
| id | name | user_id |
|---|---|---|
| 1 | test1 | 1 |
| 2 | test2 | 3 |
| 3 | test3 | 1 |
| 4 | test1 | 2 |
| 5 | test3 | 2 |
用户
| id | username |
|---|---|
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
我想选择所有具有字段条件的组:如果 userX 有超过 0 个角色,并且如果在这些角色中它有“总统”,则返回 1,否则返回 0。
所以有这样的数据:
| user_id | username | role_condition | group_name |
|---|---|---|---|
| 1 | user1 | 1 | test1 |
| 1 | user1 | 1 | test3 |
| 2 | user2 | 1 | test1 |
| 2 | user2 | 1 | test3 |
| 3 | user3 | 0 | test2 |
我试过了:
SELECT u.id,
u.username,
if(LOCATE('president', group_concat(u.role)) > 0,1,0),
g.name
FROM Group g
LEFT JOIN User u ON u.id = g.user_id
LEFT JOIN Role r ON r.user_id = u.id
如果没有 group by,由于 group_concat,它只会给我 1 行,并且我不能使用 group by,因为如果我在 user_id 或 username 上这样做它不会给我我想要的所有行。
我不知道该怎么做才能得到我想要的结果。
感谢您的帮助:)
【问题讨论】:
-
你用的是什么版本的 MySQL?
-
标准化看起来有点奇怪。组 id 1 和 4 都是“test1”,角色表中的名称是大量多余的......而且我并不真正理解期望的结果:-(
-
@PhilCoulson 5.7
-
@AlexanderDobernig 是的,我可以使用其他名称,客户想要我写的结果,它只是最后一个更改'group_name'的列
标签: php mysql sql database select