Форум: "Базы";
Текущий архив: 2007.07.15;
Скачать: [xml.tar.bz2];
ВнизМноготабличный запрос (MySQL) Найти похожие ветки
← →
Юрий © (2007-04-18 09:59) [0]Имеется несколько таблиц в одной базе данных. Все столбцы таблиц одинаковы (и по имени, и по типу хранимых данных). Необходимо из всех этих таблиц выбрать группу данных, удовлетворяющих условию, и сгруппировать по другому полю.
(SELECT * FROM table1 WHERE some_field1="ok" GROUP BY some_field2)
UNION ALL
(SELECT * FROM table2 WHERE some_field1="ok" GROUP BY some_field2)
UNION ALL
...
Соответственно, получаем в результирующем наборе данных две копии группировок по полю some_field2:1
2
3
1
2
3
...
Конечно, можно убрать UNION ALL и написать UNION, но тогда убираются все идентичные строки по всем столбцам, а не только по полю some_field2.
Вопрос: можно ли от этого избавиться или нужен другой подход? Если да, то какой.
PS. СУБД - MySQL 5.x
← →
Jan1 (2007-04-18 10:06) [1]
> Вопрос: можно ли от этого избавиться или нужен другой подход?
> Если да, то какой.
выучить наконец SQL. http://zipsites.ru/books/ponimanie_sql/
← →
Юрий © (2007-04-18 10:08) [2]> [1] Jan1 (18.04.07 10:06)
Честное слово, эта книга у меня есть.
=)
← →
Jan1 (2007-04-18 10:10) [3]
> Честное слово, эта книга у меня есть.
это уже хорошо. а ты ее читал?
Где ты в ней прочитал вот такоеSELECT * FROM table1 WHERE some_field1="ok" GROUP BY some_field2
?
← →
Jan1 (2007-04-18 10:12) [4]короче прочитай в той же книге все про UNION и о разнице между сортировкой ORDER BY и групировкой GROUP BY данных.
← →
Юрий © (2007-04-18 10:16) [5]> [4] Jan1 (18.04.07 10:12)
Сортировка - упорядочивает данные по возрастанию (ASC), убыванию (DESC).
Группировка - группирует по какому-то полю.
> [3] Jan1 (18.04.07 10:10)
А вот насчёт этого вопроса, ничего не понял. =)
← →
Jan1 (2007-04-18 10:18) [6]
> Группировка - группирует по какому-то полю.
на основании какой операции? и нужно ли оно тебе?
← →
Юрий © (2007-04-18 10:18) [7]> [4] Jan1 (18.04.07 10:12)
> короче прочитай в той же книге все про UNION
Просмотрел главу, понятно что UNION используется только с GROUP BY, и в качестве столбца указывается его номер. Применения к своему вопросу не нашёл.
← →
Юрий © (2007-04-18 10:19) [8]> [6] Jan1 (18.04.07 10:18)
> на основании какой операции? и нужно ли оно тебе?
У меня группируется по часам: HOUR(some_field2).
← →
Jan1 (2007-04-18 10:20) [9]
> У меня группируется по часам: HOUR(some_field2).
что такое группировка?
← →
Jan1 (2007-04-18 10:20) [10]
> Просмотрел главу, понятно что UNION используется только
> с GROUP BY, и в качестве столбца указывается его номер
а куда ORDER BY дел?
← →
Юрий © (2007-04-18 10:21) [11]> [9] Jan1 (18.04.07 10:20)
Я так представляю, были записи:1
2
2
3
3
4
5
5
то в результате получим:1
2
3
4
5
Я не прав?
← →
Юрий © (2007-04-18 10:22) [12]> [10] Jan1 (18.04.07 10:20)
> а куда ORDER BY дел?
Ошибка, читать как "используется только с ORDER BY", торопился.
← →
Jan1 (2007-04-18 10:23) [13]
> Я так представляю, были записи:
>
> 1
> 2
> 2
> 3
> 3
> 4
> 5
> 5
>
> то в результате получим:
>
> 1
> 2
> 3
> 4
> 5
>
> Я не прав?
читать про distinct
← →
Юрий © (2007-04-18 10:25) [14]> [13] Jan1 (18.04.07 10:23)
SELECT DISTINCT ...
Это понятно, он удаляет дубликаты, но проблема в том, что данные не хранятся как 1,2,3,4, а хранятся как datetime. Соответственно HOUR в GROUP BY.
← →
Юрий © (2007-04-18 10:29) [15]> [14] Юрий © (18.04.07 10:25)
Такой запрос прекрасно работал для одной талбицы:SELECT COUNT(*) as error_count FROM table WHERE check="not_ok" AND timestamp >= "2007-04-12" AND timestamp <= "2007-04-16" GROUP BY HOUR(timestamp)
← →
Jan1 (2007-04-18 10:44) [16]
> SELECT COUNT(*) as error_count FROM table WHERE check="not_ok"
> AND timestamp >= "2007-04-12" AND timestamp <= "2007-04-
> 16" GROUP BY HOUR(timestamp)
зачем здесь группировка?
← →
Юрий © (2007-04-18 10:45) [17]Повторяющиеся строки удалять не надо (DISTINCT), их нужно учитывать.
← →
Юрий © (2007-04-18 10:46) [18]> [16] Jan1 (18.04.07 10:44)
Есть проверки по часам, я суммирую количество выявленных ошибок в группе (т.е. одном часе проверки).
← →
Юрий © (2007-04-18 10:50) [19]Вообщем чтобы было по-понятней, есть таблица:
timestamp check
2004-02-01 01:20:00 ok
2004-02-01 01:35:00 ok
2004-02-01 02:05:00 not_ok
...
Мне нужно узнать сколько ошибок было в одном часе.
← →
Jan1 (2007-04-18 10:53) [20]
> Повторяющиеся строки удалять не надо (DISTINCT), их нужно
> учитывать.
т.е. я так понимаю разные таблицы у тебя - это ошибки от разных источников? Почему не об\дна таблица со ссылкой на источник?
← →
Jan1 (2007-04-18 10:54) [21]
> Есть проверки по часам, я суммирую количество выявленных
> ошибок в группе (т.е. одном часе проверки).
а тебя не интересует какой это час?
← →
Юрий © (2007-04-18 10:57) [22]> [21] Jan1 (18.04.07 10:54)
Интересует, никто не мешает сделать так:SELECT HOUR(timestamp) as my_group, COUNT(*) as error_count FROM table WHERE check="not_ok" AND timestamp >= "2007-04-12" AND timestamp <= "2007-04-16" GROUP BY my_group
← →
Jan1 (2007-04-18 10:59) [23]
> Интересует, никто не мешает сделать так:
так ты и пиши то что тебя интересует - оно мне надо выуживать из тебя информацию? а?
← →
Юрий © (2007-04-18 11:00) [24]> [23] Jan1 (18.04.07 10:59)
Прошу прощенья. Переходя к нескольким таблицам - как это организовать?
← →
Jan1 (2007-04-18 11:01) [25]
> Интересует, никто не мешает сделать так:
что ты будешь делать если за определенный час не было записей?
← →
Юрий © (2007-04-18 11:02) [26]Ничего, в результат ничего не попадает, для этого часа записи в выводе просто не будет.
← →
Jan1 (2007-04-18 11:04) [27]
> Прошу прощенья. Переходя к нескольким таблицам - как это
> организовать?
если MySQL поддерживает select * from (select * from ), то текущая структура пройдет, го если нет то думаю у тебе надо сделать сводную таблицу, точно такую же как и сейчас с единственным дополнением - поле признак, кто писал ошибку, допустим ссылка на справочник источников. тогда тебе не надо плодить таблицы и ты сможешь вытащить интересующую тебя информацию одним запросом.
← →
Jan1 (2007-04-18 11:04) [28]
> Ничего, в результат ничего не попадает, для этого часа записи
> в выводе просто не будет.
правильно. этого ли ты ожидаешь?
← →
Юрий © (2007-04-18 11:07) [29]> [27] Jan1 (18.04.07 11:04)
> если MySQL поддерживает select * from (select * from ),
> то текущая структура пройдет, го если нет то думаю у тебе
> надо сделать сводную таблицу, точно такую же как и сейчас
> с единственным дополнением - поле признак, кто писал ошибку,
> допустим ссылка на справочник источников. тогда тебе не
> надо плодить таблицы и ты сможешь вытащить интересующую
> тебя информацию одним запросом.
У меня была мысль, если сделать временную таблицу с записями прошедших проверку на условие, а уж эту таблицу группировать по часам, и считать количество ошибок в часе.
И ещё "select * from (select * from )" не поддерживается.
> [28] Jan1 (18.04.07 11:04)
Именно этого.
← →
Юрий © (2007-04-18 11:11) [30]> [27] Jan1 (18.04.07 11:04)
> текущая структура пройдет, го если нет то думаю у тебе надо
> сделать сводную таблицу, точно такую же как и сейчас с единственным
> дополнением - поле признак
Допустим структуру менять нельзя.
← →
Jan1 (2007-04-18 11:13) [31]
> У меня была мысль, если сделать временную таблицу с записями
> прошедших проверку на условие, а уж эту таблицу группировать
> по часам, и считать количество ошибок в часе.
зачем временную, сделай навсегда. удали расплодившиеся таблицы - сведи все в одну кучу. а старые удали. и все будет пучком.
> Именно этого.
ок.
← →
Jan1 (2007-04-18 11:14) [32]
> Допустим структуру менять нельзя.
ну если MySQL поддерживает временные таблицы, то тогда только их. Ну или ХП попробовать,в 5-ке они должны быть.
← →
Юрий © (2007-04-18 11:17) [33]> [31] Jan1 (18.04.07 11:13)
>
> зачем временную, сделай навсегда. удали расплодившиеся таблицы
> - сведи все в одну кучу. а старые удали. и все будет пучком.
Я несколько неправильно выразился. Соединить бы все данные, из всех таблиц, а уж к ним применить:SELECT COUNT(*) as error_count FROM (тут все данные) WHERE check="not_ok" AND timestamp >= "2007-04-12" AND timestamp <= "2007-04-16" GROUP BY HOUR(timestamp)
Создавать, удалять, изменять нельзя. Допустим таблицы read only.
← →
Юрий © (2007-04-18 11:20) [34]> [32] Jan1 (18.04.07 11:14)
> ну если MySQL поддерживает временные таблицы
Это и хотелось узнать, т.к. чтение мануала не натолкнуло на правильный путь. Хотя возможно надо просто усердней читать.
← →
Юрий © (2007-04-18 11:26) [35]У меня мануал от 5.0.6 beta, там говорится что хранимые процедуры планируется реализовать в MySQL 5.0. =)
← →
Jan1 (2007-04-18 13:09) [36]Ну тогда ед. решение - получить одним запрососм где будет UNION ALL а на клиенте руцями пройтись и просуммировать...
← →
Юрий © (2007-04-18 13:46) [37]> [36] Jan1 (18.04.07 13:09)
> Ну тогда ед. решение - получить одним запрососм где будет
> UNION ALL а на клиенте руцями пройтись и просуммировать...
Думал и про это, не элегатно получается. Да и там могут быть случаи, когда информации очень много, и если учитывать, что сервер с этими таблицами разделён с сервером, на котором мой скрипт, то развивается неслабый траффик. Самый лучший способ всё-таки возложить на MySQL, разбирать данные тихим скриптом PHP не кошерно.
← →
Jan1 (2007-04-18 13:53) [38]
> Самый лучший способ всё-таки возложить на MySQL, разбирать
> данные тихим скриптом PHP не кошерно.
ну или ПХП. можно и н а сервак это можно возложить, но я так понял Вы прав не имеете?
← →
Юрий © (2007-04-18 13:55) [39]> [38] Jan1 (18.04.07 13:53)
> ну или ПХП. можно и н а сервак это можно возложить, но я
> так понял Вы прав не имеете?
Можно возложить и на сервер, права найдутся. Смысл в том, что создатели СУБД наверняка разбор сделали гораздо быстрее, и уж точно не на PHP.
← →
Jan1 (2007-04-18 13:57) [40]Ну так в перед: сливайте все в одну таблицу и делайте подсчет одним запросом.
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2007.07.15;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.046 c