我有以下MySQL查询:
SELECT l.user_id, u.ID, u.ULN, count(u.ULN) As ULN_count
FROM table_Learning l
LEFT JOIN table_users u
ON l.ULN = u.ULN
WHERE l.user_id is null
AND (SELECT COUNT(ULN)
FROM Table_users
WHERE ULN = u.ULN
GROUP BY ULN) < 2
GROUP BY u.ULN
我对此查询的期望是,字段ULN_Count
的值不能大于1.
但是,由于字段的值大于1,查询无法实现此目的。
我做错了什么?
答案 0 :(得分:1)
你必须将这个子查询移动到像这样的状态
SELECT
l.user_id, u.ID, u.ULN, count(u.ULN) As ULN_count
FROM
Table_Learning l
LEFT JOIN table_users u ON l.ULN = u.ULN
WHERE
l.user_id is null
GROUP BY u.ULN
HAVING count(u.ULN) < 2
答案 1 :(得分:1)
setTimeout(simpleMessage(), 5000);
子句中的子选择正在对聚合WHERE
值进行比较,因此确实属于COUNT(u.ULN)
子句。它应该具有更高的性能,因为子查询将针对外部查询返回的每一行进行评估,而HAVING
过滤器仅针对整个聚合查询应用一次。
HAVING
如果没有看到您的示例数据,MySQL的默认SELECT
l.user_id,
u.ID, u.ULN,
count(u.ULN) As ULN_count
FROM
table_Learning l
LEFT JOIN table_users u
ON l.ULN = u.ULN
WHERE l.user_id is null
GROUP BY u.ULN
-- The aggregate can be compared & filtered in HAVING
-- which is applied just once for the whole query
-- and you can use the alias for comparison
HAVING ULN_count < 2
行为可能会让您感到悲伤。 GROUP BY
中不属于SELECT
等聚合的所有列也应包含在COUNT(),SUM(),MAX()
中,特别是如果您要加入多个表格。除了一对一的关系之外,MySQL可能会为未分组的列返回不确定的结果(在此上下文中为GROUP BY
)。