MySQL COUNT для таблицы LEFT JOINed игнорирует ни одну присоединенную запись - PullRequest
0 голосов
/ 11 июня 2018

У меня есть 3 таблицы (это основные поля):

  • друг (хранит друзей пользователей)

    • id_user
    • id_str (уникальный идентификатор твиттера)
  • user (хранит пользователей)

    • id_user
    • id_str (уникальный идентификатор Twitter)
    • name
  • 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 голосов
/ 11 июня 2018

Полагаю, что если нет значения для группировки, оно исключается.

Обратите внимание, что вы группируете по "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

...