【问题标题】:MySQL COUNT on LEFT JOINed table is ignoring none joined recordsLEFT JOINed 表上的 MySQL COUNT 忽略未连接的记录
【发布时间】:2018-06-11 17:54:02
【问题描述】:

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

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

    • id_user
    • id_str (推特唯一 ID)
  • 用户(存储用户)

    • id_user
    • id_str (推特唯一 ID)
    • 姓名
  • wc_forecast (存储用户的足球预测)

    • id_forecast
    • id_user

我需要从 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 中没有记录的好友?

【问题讨论】:

    标签: mysql group-by left-join


    【解决方案1】:

    我想如果没有分组依据的价值,它就会被排除在外。

    请注意,您是按“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

    【讨论】:

    • 谢谢!效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    相关资源
    最近更新 更多