2013-08-09 4 views
1
       Tables 
_________________________  _________________________ 
|__________items__________|  |_______readStatus________| 
|___itemId___|____data____|  |___itemId___|___status___| 
| 1   | cats  |  | 1   | 1   | 
| 2   | dogs  |  | 2   | 1   | 
| 3   | fish  |  |   |   | 
-------------------------  ------------------------- 

У меня есть две таблицы MySQL, похожие на приведенные выше. Мне нужно получить записи из таблицы item, которые не имеют соответствующего status1 в таблице readStatus. Поэтому в этом примере мне нужна запись, где data - fish. Я не очень хорошо знаком с SQL, так что я точно не знаю, как получить об этом, но на основе других вопросов, я пришел с этим:Выбрать Элементы, не соответствующие им Соответствующие товары в другой таблице

SELECT * 
FROM items 
INNER JOIN 
readStatus 
ON items.itemId = readStatus.itemId 
WHERE readStatus.status != 1 

Это не работает, хотя, потому что он пропускает ни одной записи в таблице items, которые не имеют соответствующей записи в таблице readStatus. Добавление status0 записей для поиска не является вариантом, так как в конечном итоге оно создаст миллионы записей. Также похоже, что в phpMyAdmin он объединяет записи в один вывод, который я действительно не хочу, но это не разбойник.

Любая помощь приветствуется.

ответ

3

Используйте LEFT JOIN вместо INNER JOIN:

SELECT * 
FROM items 
LEFT JOIN //left join 
readStatus 
ON items.itemId = readStatus.itemId 
WHERE (readStatus.status != 1 OR readStatus.status IS NULL); 

LEFT JOIN Прочитайте учебник.

+1

Спасибо! Это решило проблему, и я узнал о «LEFT JOIN» – AkBKukU

0
SELECT * FROM items LEFT JOIN readStatus ON items.itemId = readStatus.itemId 
WHERE readStatus.itemId IS NULL 
0

WHERE ReadStatus IS NULL OR readStatus.status! = -1

0

Вы должны использовать LEFT JOIN

SELECT * FROM items LEFT JOIN readStatus ON items.itemId = readStatus.itemId and readStatus.status != 1; 

Как это будет работать.

Он будет принимать все строки Wrom элементов таблицы, когда из ReadStatus будет принимать только то, что что соответствующий Itemid и не находятся в состоянии 1.

3

На самом деле, это звучит как-то, что лучше было бы решить с СУЩЕСТВУЕТ, а не a (слева):

SELECT * 
FROM items 
WHERE NOT EXISTS (SELECT 1 
        FROM readStatus 
        WHERE items.itemId = readStatus.itemId 
        AND readStatus.status = 1) 
Смежные вопросы