gpt4 book ai didi

mysql - 分组有问题?

转载 作者:行者123 更新时间:2023-11-28 23:21:15 25 4
gpt4 key购买 nike

I asked earlier about a solution to my problem which worked但是现在,当我尝试从第二个表(存储更多信息)中获取一些信息时,我遇到了一些问题。

我的表格如下

Users

+----+----------------------+---------------+------------------+
| id | username | primary_group | secondary_groups |
+----+----------------------+---------------+------------------+
| 1 | Username1 | 3 | 7,10 |
| 2 | Username2 | 7 | 3,5,10 |
| 3 | LongUsername | 1 | 3,7 |
| 4 | Username3 | 1 | 3,10 |
| 5 | Username4 | 7 | |
| 6 | Username5 | 5 | 3,7,10 |
| 7 | Username6 | 2 | 7 |
| 8 | Username7 | 4 | |
+----+----------------------+---------------+------------------+

Profile

+----+---------------+------------------+
| id | facebook | steam |
+----+---------------+------------------+
| 1 | 10049424151 | 11 |
| 2 | 10051277183 | 55 |
| 3 | 10051281183 | 751 |
| 4 | | 735 |
| 5 | 10051215770 | 4444 |
| 6 | 10020210531 | 50415 |
| 7 | 10021056938 | 421501 |
| 8 | 10011547143 | 761 |
+----+---------------+------------------+

我的 SQL 如下(基于之前的线程)

SELECT u.id, u.username, p.id, p.facebook, p.steam 
FROM users u, profile p
WHERE p.id=u.id AND FIND_IN_SET( '7', secondary_groups )
OR primary_group = 7
GROUP BY u.id

问题是我的输出显示如下

+----+----------------------+-------------+-------+
| id | username | facebook | steam |
+----+----------------------+-------------+-------+
| 1 | Username1 | 10049424151 | 11 |
| 2 | Username2 | 10051277183 | 55 |
| 3 | LongUsername | 10051281183 | 751 |
| 4 | Username4 | 10051215770 | 4444 |
| 5 | Username5 | 10049424151 | 11 |
| 6 | Username6 | 10049424151 | 55 |
+----+----------------------+-------------+-------+

最佳答案

我猜问题出在 profile带有 primary_group 的行的 7正在与所有 user 匹配行。删除 GROUP BY ,您将能够更好地了解正在发生的事情。

但这只是一个猜测。目前尚不清楚您要实现的目标。

我怀疑您对 AND 的优先顺序感到困惑和 OR . (AND 运算符的优先级高于 OR 运算符。这意味着 AND 将在 OR 之前计算。)

快速解决方法是添加一些括号,以覆盖默认的操作顺序。像这样:

WHERE p.id=u.id AND ( FIND_IN_SET('7',secondary_groups) OR primary_group = 7 )
-- ^ ^

括号会导致 OR要评估的操作(为 TRUE、FALSE 或 NULL),然后将在 AND 中评估结果.

没有括号,就好像这里有括号一样:

WHERE ( p.id=u.id AND FIND_IN_SET('7',secondary_groups) ) OR primary_group = 7 
-- ^ ^

随着 AND首先评估条件,然后由 OR 操作其结果.这就是导致具有 7 的配置文件行与具有 不同 id 值的用户中的行相匹配的原因。


关于风格的几点建议:

  • 在联接操作中避免使用老式的逗号运算符,而使用较新的 JOIN语法

  • 将连接谓词(条件)放在 ON 中子句,WHERE 中的其他过滤条件子句

  • 限定所有列引用

举个例子:

  SELECT u.id
, u.username
, p.id
, p.facebook
, p.steam
FROM users u
JOIN profile p
ON p.id = u.id
WHERE u.primary_group = 7
OR FIND_IN_SET('7',u.secondary_groups)
ORDER BY u.id

我们只需要一个GROUP BY如果我们想“折叠”行。如果id列在 users 中都是唯一的和 profile表,那么就不需要 GROUP BY u.id .我们可以添加一个 ORDER BY如果我们希望以特定顺序返回行的子句。

关于mysql - 分组有问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41515252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com