![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Объединение данных из двух SQL-запросов
GlFox © (2007-12-07 17:38:00)Есть две таблицы (на самом деле их больше, но интересуют только две):
1) pics - [group_id, pic_type, pic_id]
2) pic_count - [group_id, pic_type, pic_count]
Допустимо предположение, что все поля в обеих таблицах целочисленные.
Запрос для получения количества картинок по типам из таблицы pics:
select Group_ID, Pic_Type, count(Pic_ID) from Pics group by Group_ID, Pic_Type
В идеале данные, полученные из приведенного запроса должны соответсвовать записям в таблице pic_count. Но только в идеале...
В таблицах нет Foreign Key (не спрашивайте почему, не знаю) и не будет.
Как одним запросом получить только записи не совпадающие из двух наборов:
-select Group_ID, Pic_Type, count(Pic_ID) from Pics group by Group_ID, Pic_Type
-select * from Pic_Count
Sergey13 (2007-12-10 11:59:00) [1]> [6] GlFox © (10.12.07 11:43)
> А в чем отличие?
Без ALL убирает дубликаты, для чего упорядочивает результат. С ALL просто выдает все что есть.
GlFox (2007-12-10 11:43:00) [2]> [5] Sergey13 © (10.12.07 11:23)
В данном случае не особо принципиально из какой части запроса пришел ответ. А приходить он может из любой или даже из двух сразу...
Хотя в флажок, конечно, не помешает никоим образом, а даже и поможет при разборе результатов.
Насчет union all не знаю... А в чем отличие?
Sergey13 (2007-12-10 11:23:00) [3]> [4] GlFox © (10.12.07 11:13)
Хоть какой флажок добавь для обозначения из какой части запроса ответ пришел. И наверное тут уместнее будет union all.
GlFox (2007-12-10 11:13:00) [4]В итоге получился запрос такого вида, если кому интересно (а даже, если не интересно, все равно такой):
select P.Group_ID, P.Pic_Type, count(P.Pic_ID) as Pic_Cnt0 from Pics P
group by P.Group_ID, P.Pic_Type
having Pic_Cnt0<>(select PC.Pic_Count from Pic_Count PC where PC.Group_ID=P.Group_ID and PC.Pic_Type=P.Pic_Type)
union
select PC.Group_ID, PC.Pic_Type, PC.Pic_Count from Pic_Count PC
where not exists(select P.Group_ID from Pics P where P.Group_ID=PC.Group_ID and P.Pic_Type=PC.Pic_Type)
Спасибо за внимание и сочувствие ;) Если есть предложения по оптимизации, будет интересно их увидеть...
GlFox (2007-12-07 17:58:00) [5]Ага. Забыл еще сказать что СУБД MySQL 5.0
GlFox (2007-12-07 17:50:00) [6]> [1] Stas © (07.12.07 17:43)
Прошу прощения за непонятливость, но откуда берутся поля типа q1.id и q.id?
Stas (2007-12-07 17:43:00) [7]select * from
(select Group_ID, Pic_Type, count(Pic_ID) from Pics group by Group_ID, Pic_Type) as Q FULL OUTER JOIN
(select * from Pic_Count) as q1 ON q1.id=q.id
WHERE q1.id is null or q.id is null