LEFT JOINed表上的MySQL COUNT忽略没有连接的记录

时间:2018-06-11 17:54:03

标签: mysql group-by left-join

我有3个表(这些是主要字段):

  • 朋友(存储用户的朋友)

    • id_user
    • id_str (推特唯一身份证)
  • 用户(存储用户)

    • id_user
    • id_str (推特唯一身份证)
    • 名称
  • wc_forecast (存储用户的足球预测)

    • id_forecast
    • id_user

我需要从用户ID 3 中选择所有朋友的列表,以及他们的预测计数。这是我目前的查询:

SELECT
COUNT(wc_forecast.id_forecast) AS q,
user.name AS name, user.screen_name AS screen_name
FROM user
    JOIN friend ON friend.id_str = user.id_str
    LEFT JOIN wc_forecast ON wc_forecast.id_user = user.id_user
WHERE
    friend.id_user = 3
GROUP BY wc_forecast.id_user
ORDER BY q DESC

问题是并非所有用户都在显示。特别是那些没有做出任何预测的人不在该列表中。奇怪的是,其中只有一个是。

这是一个带有一些示例记录的SQL Fiddle

问题是,如何显示所有用户朋友的列表,包括wc_forecast中没有记录的所有朋友?

1 个答案:

答案 0 :(得分:2)

我认为,如果没有分组值,则将其排除。

请注意,您要按“wc_forecast.id_user”进行分组,这可能存在也可能不存在。如果确实存在,则获得价值。如果它不存在,你什么也得不到。也许你想通过COALESCE分组(wc_forecast.id_user,user.id_user)?或者只是按user.id_user进行分组,因为如果朋友的预测存在,它们应该是相同的值。

SELECT
  COUNT(wc_forecast.id_forecast) AS q,
  user.name AS name,
  user.screen_name AS screen_name
FROM user
  JOIN friend ON friend.id_str = user.id_str
  LEFT JOIN wc_forecast
    ON wc_forecast.id_user = user.id_user
WHERE
    friend.id_user = 3
GROUP BY
  user.id_user
ORDER BY
  q DESC

http://sqlfiddle.com/#!9/3519c/12/0