Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.15;
Скачать: CL | DM;

Вниз

Многотабличный запрос (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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.016 c
2-1182599910
Ламер 2.Х
2007-06-23 15:58
2007.07.15
Дата


15-1181711931
boriskb
2007-06-13 09:18
2007.07.15
Маклауд?


15-1181888238
StriderMan
2007-06-15 10:17
2007.07.15
Ваши старые исходники


15-1181807682
rghrg
2007-06-14 11:54
2007.07.15
Факультет фотоники и оптоинформатики


3-1176698721
pavel_guzhanov
2007-04-16 08:45
2007.07.15
Перестал работать скрипт