Задавайте вопросы, мы ответим
Вы не зашли.
Подскажите можно ли в одном запросе получить данные подобным образом? И если да, то как?
Таблица 1: post (id, title, text)
1, test1, ....
2, test2, ....
3, test3, ....
4, test4, ....
Таблица 2: post_adv (id, post_id, name, value)
1, 1, type, news
2, 1, date, 2012-01-01
3, 1, email, y@y.ru
4, 2, email, w@w.ru
1, 3, type, ask
2, 3, date, 2012-11-24
Для некоторых постов (~1%) из таблицы post существуют дополнения в таблице post_adv.
Привязка записей идёт по post.id = post_adv.post_id
К одному post.id может быть несколько (до 10) записей в post_adv отличающихся значениями name
Нужно составить запрос чтобы на выходе получить строки из post для которых нет дополнений в post_adv и строки из post, к которым есть дополнения с name равными type и date. Причём вернуться должны значения полей value, а сами поля назвать type и date:
post.id title text type date
1 test1 .... news 2012-01-01
2 test2 .... NULL NULL
3 test3 .... ask 2012-11-24
4 test4 .... NULL NULL
Примерный вариант такой:
SELECT post.id, post.title, max( if(post_adv.name = 'new', Value, NULL ) ) AS type , max( if(post_adv.name = 'date', Value, NULL ) ) AS date
FROM post, post_adv WHERE post.id = post_adv.post_id GROUP BY post.id
Но не выводятся строки, к которым нет дополнения
Отредактированно Strannik (25.08.2013 11:42:58)
Неактивен
SELECT post.id FROM post LEFT JOIN post_adv ON post.id = post_adv.post_id WHERE post_adv.post_id IS NULL -- вернет строки, не имеющие дополнения.
Ваш запрос вернет все строки, имеющие дополнения, а не только "к которым есть дополнения с name равными type и date".
Неактивен
Спасибо!
Я нашёл похожее решение, где выводятся все строки по моему условию.
SELECT post.id, post.title, news.value AS news2, asc1.value AS asc2
FROM post
LEFT JOIN post_adv news1 ON news1.name = 'news' AND post.id = news1.post_id
LEFT JOIN post_adv asc1 ON asc1.name = 'asc' AND post.id = asc1.post_id
ORDER BY post.id
Теперь другая задача появилась как вызвать из post только те строки, к которым в post_adv есть поля со значениями `name` = 'asc' и 'news'
А с остальными не выводить.
УПС. Это решилось ещё быстрее.)
Спасибо, что натолкнули на мысль.
SELECT post.id, post.title, news1.value AS news2, asc1.value AS asc2 FROM post, post_adv news1, post_adv asc1
WHERE (news1.name = 'news' AND post.id = news1.post_id) AND (asc1.name = 'asc' AND post.id = asc1.post_id)
ORDER BY post.id
Отредактированно Strannik (25.08.2013 11:55:15)
Неактивен