2012-05-13 2 views
11

У меня есть таблица 'meta_data' со следующими полями:MySQL Присоединяйтесь к той же таблице

  • идентификатор
  • POST_ID
  • meta_key
  • meta_value

Я хотел бы, чтобы петля через и отобразить список EACH post (post_id), который имеет запись для meta_key='abc', но не один за meta_key='def'

В принципе, каждый пост, который имеет meta_key='abc' записи должна иметь meta_key='def' записи. Я хочу создать список, чтобы добавить отсутствующие записи meta_key='def'.

+5

Это хорошо - но что вы пробовали? –

ответ

14

для того чтобы достигнуть этого вы должны используйте операцию LEFT OUTER JOINприсоединение к той же таблице.

SELECT a.* 
FROM meta_data a 
LEFT OUTER JOIN meta_data b ON a.post_id = b.post_id AND b.meta_value = 'def' 
WHERE 
a.meta_value = 'abc' 
AND b.id IS null 
7

сделать внешний (слева) присоединиться к себе, фильтрации тех записей, которые не матча, посмотрев на строки с нулевым идентификатором в объединенной таблице:

select t1.* 
from meta_data t1 
left join meta_data t2 on t2.post_id = t1.post_id and t2.meta_key='def' 
where t1.meta_key='abc' 
and t2.id is null 
Смежные вопросы