MySQL选择计数的地方

时间:2015-06-23 13:19:19

标签: mysql

我有以下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,查询无法实现此目的。

我做错了什么?

2 个答案:

答案 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)。