【问题标题】:SQL Using group_concatSQL 使用 group_concat
【发布时间】: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


【解决方案1】:

你可以在没有聚合的情况下使用 EXISTS:

SELECT u.id, u.username,
       EXISTS (
         SELECT 1 FROM Role r
         WHERE r.user_id = u.id AND r.name = 'president'
       ) role_condition, 
       g.name
FROM `User` u INNER JOIN `Group` g
ON g.user_id = u.id
ORDER BY u.id

如果您想要所有用户,即使是没有任何组的用户,请更改为 LEFT 加入。

请参阅demo
结果:

id username role_condition name
1 user1 1 test1
1 user1 1 test3
2 user2 1 test1
2 user2 1 test3
3 user3 0 test2

【讨论】:

  • 谢谢你的回答,它在本地运行良好,但在客户服务器上它给了我一个 500,因为在我的请求中我必须存在很多(如果它是 mysql 5.7 的版本,idk )
  • @pham01 我的查询适用于您在问题中描述的要求,它提供了您预期的结果。我不能说为什么你会在 Mysql 服务器中收到 500 错误。
  • 请查看服务器错误日志,您将在其中找到导致 Error500 消息的确切错误消息。发布错误和发生错误的代码,您可能会得到帮助
  • @AlexanderDobernig 是的,这是内存限制错误
  • 请告诉我们完整的错误行
猜你喜欢
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 2020-07-16
  • 1970-01-01
相关资源
最近更新 更多