Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-1176460611
Marat
2007-04-13 14:36
2007.07.15
Можно ли одним запросом?


15-1182094571
Nic
2007-06-17 19:36
2007.07.15
Nokia PC Siute не видит телефон


2-1182462324
wesel
2007-06-22 01:45
2007.07.15
Востановить файлы проэкта


15-1181700973
Slider007
2007-06-13 06:16
2007.07.15
С днем рождения ! 13 июня 2007 среда


3-1176701592
X_ksandr_X
2007-04-16 09:33
2007.07.15
из StringGrid в Excel





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский