показ пустых строк с использованием соединения - PullRequest
0 голосов
/ 19 марта 2010

В MySQL я выбираю из таблицы крики имеющий внешний ключ к другой таблице с именем "roleuser" с соответствующим столбцом как user_id

Теперь столбец user_id в таблице криков для некоторых строк равен нулю (на самом деле не null, но без вставок в mysql)

Как показать все строки таблицы криков с user_id null или нет

Я выполняю SQL-оператор

SELECT s.*, r.firstname, r.lastname
FROM shouts s left join roleuser r where r.user_id = s.user_id limit 50;

, который не выполняется и показывает

 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where r.user_id = s.user_id limit 50' at line 2

но с использованием внутреннего соединения выполняется sql, который показывает строки которые имеют только значения user_id в таблице криков. нули не отображаются.

SELECT s.*, r.firstname, r.lastname
FROM shouts s inner join roleuser r where r.user_id = s.user_id limit 50;

Как я могу показать все строки из таблицы криков и нулевые значения в столбцы имя и фамилия, где user_id является нулем в таблице криков. Если это вообще невозможно, с помощью SQL можно использовать хранимые процедуры ...

Спасибо

Pradyut

Ответы [ 2 ]

2 голосов
/ 19 марта 2010

Похоже, вы хотите

SELECT s.*, r.firstname, r.lastname 
FROM shouts s left join roleuser r ON r.user_id = s.user_id limit 50;

Вы использовали WHERE вместо ON.

Ваш второй запрос работал, потому что

SELECT s.*, r.firstname, r.lastname 
FROM shouts s inner join roleuser r where r.user_id = s.user_id limit 50; 

простослучается, что дает те же результаты, что и

SELECT s.*, r.firstname, r.lastname 
FROM shouts s inner join roleuser r ON r.user_id = s.user_id limit 50; 

, хотя они означают немного разные вещи.Для ВНУТРЕННЕГО СОЕДИНЕНИЯ ON является необязательным, и если вы укажете его, вы получите декартово произведение всех строк в первой таблице и всех строк во второй таблице, тогда ваше предложение WHERE отфильтрует все несоответствующиестрок.Если вместо этого вы помещаете условие в предложение ON, объединение оценивает только совпадающие строки, и вам не нужно помещать условие в ваше предложение WHERE.В любом случае результаты для внутреннего объединения идентичны.

Однако внешнее объединение не имеет эквивалента для эквивалента предложения WHERE, поэтому его предложение ON не является обязательным.

2 голосов
/ 19 марта 2010

Вы хотите добавить ON в ваше объединение.

SELECT s.*, r.firstname, r.lastname
FROM  roleuser r 
  LEFT JOIN shouts s 
    ON s.user_id = r.user_id 
WHERE
    r.firstname like '%byron%' -- where clause goes here..

LIMIT 50;
...