2011-08-31 4 views
3

Почему этот запрос sql показывает только результаты, если у них есть только строка в users_warnings?Почему мой запрос не возвращает никаких результатов?

SELECT 
u.id, 
uw.warning 
FROM 
users u 
INNER JOIN users_warnings uw ON (
    u.id = uw.uID 
) 
LIMIT 21 

Я хочу показать всех пользователей, но также получить столбец «предупреждение» в users_warnings, если таковой имеется.

ответ

6

INNER JOIN возвращает только что-то, если в обеих таблицах есть данные.
Попробуйте LEFT JOIN вместо:

SELECT u.id, uw.warning FROM users u 
      LEFT JOIN users_warnings uw ON (u.id = uw.uID) 
      LIMIT 21 
+0

Это больше похоже на то, что вы хотите, а не на внешнее соединение – kralco626

6

Потому что вы используете inner join, что требует наличия строки на объединенной таблице. Попробуйте следующее:

SELECT 
u.id, 
uw.warning 
FROM 
users u 
LEFT JOIN users_warnings uw ON (
    u.id = uw.uID 
) 
LIMIT 21 
2

Изменение вашего внутреннего соединения для соединения слева, как это:

SELECT u.id, uw.warning FROM users u 
       LEFT JOIN users_warnings uw ON (u.id = uw.uID) 
       LIMIT 21 
1
SELECT 
    u.id, 
    IFNULL(uw.warning,'') warning 
FROM 
    (SELECT id FROM users LIMIT 21) u 
    LEFT JOIN users_warnings uw 
    ON u.id = uw.uID 
; 
  • Должно быть LEFT JOIN не INNER JOIN
  • Refactored запрос на получение первых 21 пользователя перед попыткой JOIN (более быстрый запрос)
  • По умолчанию предупреждение пустой строки, если у пользователя не было предупреждения
Смежные вопросы