Объединять таблицы только там, где значение не указано в таблице B - PullRequest
3 голосов
/ 02 сентября 2011

Я пытаюсь объединить 2 таблицы и выполнить фильтрацию по отсутствующему значению.

Table_Items: item_id, title и т. Д.

Table_History: item_id, history_id, action, date

Для каждого диска есть много возможных действий (купленных, добавленных, воспроизведенных, скопированных и т. Д.), Каждое действие создает новую строку в table_history, связанную с item_id.Запрос, который я ищу, вернет все диски, которые не были скопированы.Мой запрос возвращает слишком много строк, все возвращается, потому что в таблице истории есть по крайней мере одна запись для каждого элемента.

SELECT items.item_id, items.title AS Title, items.`author/creator`, history.action 
FROM items
LEFT JOIN history ON items.item_id = history.item_id
WHERE history.action NOT LIKE 'Ripped%' GROUP BY items.item_id ORDER BY title

Я использую mySQL.Помощь будет оценена!Спасибо.

1 Ответ

7 голосов
/ 02 сентября 2011

Просто добавьте фильтр действий в объединение, а затем проверьте на нулевое значение (против объединения) в поле, где

SELECT items.item_id, 
       items.title AS title, 
       items.`author/creator`, 
       history.ACTION 
FROM   items 
       LEFT JOIN history 
         ON items.item_id = history.item_id 
            AND history.ACTION LIKE 'Ripped%' 
WHERE  history.item_id IS NULL 
GROUP  BY items.item_id 
ORDER  BY title 

Вы также можете сделать не в

SELECT items.item_id, 
   items.title AS title, 
   items.`author/creator`, 
   history.ACTION 
FROM   items 
       LEFT JOIN history 
         ON items.item_id = history.item_id 
WHERE  history.item_id NOT IN (SELECT history.item_id 
                                      FROM   history 
                                      WHERE  history.ACTION LIKE 'Ripped%') 
GROUP  BY items.item_id 
ORDER  BY title 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...