Похоже, вы хотите
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
не является обязательным.