Таблица присоединения MySql, которая не имеет совпадений, показывает нулевые значения - PullRequest
0 голосов
/ 12 марта 2011

Здравствуйте, я пытаюсь присоединиться к таблице следующим образом:

  SELECT
    u.mobile_number,
    u.dob,
    u.gender,
    u.country,
    SUM(b.reward_points) AS points
  FROM users u
  JOIN bookings b ON u.user_id=b.user_id
  WHERE u.user_id=20
  AND b.attended=1
  AND b.review_completed=1
  AND b.date > "2010-03-12"
  AND b.reward_used=0

, однако, поскольку в таблице заказов нет записей для user_id 20, все возвращаемые столбцы имеют значение NULL.Я хочу получить значения для пользователя обратно, а баллы вернули NULL (когда в таблице бронирований соответствующие строки не найдены).Как я могу сделать эту работу?Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 12 марта 2011

Необходимо переместить все условия в таблице b из предложения WHERE в предложение ON:

  SELECT
    u.mobile_number,
    u.dob,
    u.gender,
    u.country,
    SUM(b.reward_points) AS points
  FROM users u
  LEFT JOIN bookings b 
    ON u.user_id=b.user_id
    AND b.attended=1
    AND b.review_completed=1
    AND b.date > "2010-03-12"
    AND b.reward_used=0
  WHERE u.user_id=20

Объяснение : Предложение WHERE фильтрует результат независимо от того, какой тип JOIN вы используете - записи без совпадений в таблице b не могут удовлетворять никаким условиям в этой таблице, поэтому они не возвращаются запросом. Предложение ON определяет, как присоединять записи из таблицы b к записям из таблицы u (поэтому объединяются только записи с b.attended = 1 и т. Д.).

0 голосов
/ 12 марта 2011

Вы можете добавить предложение:

group by u.mobile_number, u.dob, u.gender, u.country

в конце вашего исходного запроса, а также используйте INNER JOIN вместо JOIN. Надеюсь, это поможет.

0 голосов
/ 12 марта 2011

Попробуйте использовать INNER JOIN вместо JOIN, чтобы присоединиться, только если в таблице booking есть строки, отвечающие условию u.user_id=b.user_id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...