mysql查询组按总计

时间:2017-08-30 14:19:08

标签: mysql join group-by

我正在使用以下查询从2个由userID链接的表中检索每个州的事件数。

SELECT state,COUNT(*) AS num 
FROM tableUserInfo
WHERE userID IN (SELECT userID  
                 FROM tableEvents 
                 WHERE conditionOne = 1 
                   AND conditionTwo = 2) 
GROUP BY state

此查询正常运行。我的问题是并非所有州都有用户条目,我需要查询为那些返回0。我想知道是否有一个方法,如加入或使用in子句,包括一组所有状态,使查询返回0表示没有tableEvents中的条目?

2 个答案:

答案 0 :(得分:1)

正如@ raymond-nijland建议你可以使用Left Join来包含所有状态。

np.allclose(a, b)

答案 1 :(得分:1)

你有州名单吗?如果没有,那么这将给出数据库知道的所有状态的列表:

SELECT DISTINCT state FROM tableUserInfo

....并将其括在括号中,可以在下面的查询中删除它:

SELECT s.state, IFNULL(cnt, 0) AS num
FROM list_of_states s
LEFT JOIN (
    SELECT state,COUNT(*) AS cnt 
    FROM tableUserInfo ui
    INNER JOIN tableEvents te
    ON ui.userId=te.userId
    WHERE conditionOne = 1 
    AND conditionTwo = 2
    GROUP BY state
) u
ON s.state=u.state;

虽然没有“list_of_states”,但执行此操作会更有效:

SELECT ui.state, SUM(IF(te.userId IS NULL, 0, 1)) AS cnt 
FROM tableUserInfo ui
LEFT JOIN tableEvents te
   ON ui.userId=te.userId
   AND te.conditionOne = 1 
   AND te.conditionTwo = 2
GROUP BY state;