我正在使用以下查询从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中的条目?
答案 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;