Страница 1 из 1
Запрос из двух и более таблиц
Добавлено: 2008-12-24 9:01:21
zar0ku1
Дано: mysql 5.0, есть база данных в которой одинаковые таблицы по своей структуре, но с разными данными. Структуру таблиц менять нельзя.
Чтобы было проще есть 3 магазина, в них привозят товары, структура таблицы
Код: Выделить всё
|_id_|__date____|type_|_count_|
|__1_|2008-12-24|_phone|_3____|
|__2_|2008-12-24|_phone|_4____|
На каждый магазин своя таблица, то есть допустим в один день привезли телефоны 5 и 4 штуки. Нужно вывести сколько телефонов всего привезли.
При запросе:
Код: Выделить всё
$query="SELECT `date`, SUM(count) AS `count` FROM `mag1` WHERE `date` LIKE '2008-12-%' and `type`='phone' GROUP BY `date` UNION SELECT `date`, SUM(count) AS `count` FROM `mag2` WHERE `date` LIKE '2008-12-%' and `type`='phone' GROUP BY `date` ORDER BY `date` ASC;
выводит следующее:
Код: Выделить всё
2008-12-21 164
2008-12-21 110
2008-12-22 213
2008-12-22 239
2008-12-23 222
2008-12-23 311
2008-12-24 214
2008-12-24 134
А мне нужно чтобы выводило следующее:
Код: Выделить всё
2008-12-21 274
2008-12-22 452
2008-12-23 533
2008-12-24 348
Re: Запрос из двух и более таблиц
Добавлено: 2008-12-24 9:22:20
hizel
Код: Выделить всё
(SELECT `date`, SUM(count) AS `count` FROM `mag1` WHERE `date` LIKE '2008-12-%' and `type`='phone')
UNION
(SELECT `date`, SUM(count) AS `count` FROM `mag2` WHERE `date` LIKE '2008-12-%' and `type`='phone')
GROUP BY `date` ORDER BY `date` ASC;";
нет?
Re: Запрос из двух и более таблиц
Добавлено: 2008-12-24 9:36:49
zar0ku1
hizel писал(а):Код: Выделить всё
(SELECT `date`, SUM(count) AS `count` FROM `mag1` WHERE `date` LIKE '2008-12-%' and `type`='phone')
UNION
(SELECT `date`, SUM(count) AS `count` FROM `mag2` WHERE `date` LIKE '2008-12-%' and `type`='phone')
GROUP BY `date` ORDER BY `date` ASC;";
нет?
Пробовал
Код: Выделить всё
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY `date` ORDER BY `date` ASC' at line 7
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY `date` ORDER BY `date` ASC' at line 7
Re: Запрос из двух и более таблиц
Добавлено: 2008-12-24 10:34:17
hizel
при моем знании sql в башку приходят только временная таблица

Re: Запрос из двух и более таблиц
Добавлено: 2008-12-24 11:01:42
zar0ku1
hizel писал(а):при моем знании sql в башку приходят только временная таблица

при моем тоже, но я знаю, что такие вещи в мускуле реализованны 100%, просто я их не знаю
Re: Запрос из двух и более таблиц
Добавлено: 2008-12-24 11:07:50
ProFTP
Код: Выделить всё
SELECT `date`,
SUM(count) AS `count`,
(SELECT SUM(count) FROM `mag2` WHERE `date` LIKE '2008-12-%' and `type`='phone' GROUP BY `date` ORDER BY `date` ASC) AS `count2`,
(SELECT `date` FROM `mag2` WHERE `date` LIKE '2008-12-%' and `type`='phone' GROUP BY `date` ORDER BY `date` ASC) AS `date`
FROM `mag1`
WHERE `date`
LIKE '2008-12-%' and `type`='phone'
GROUP BY `date`
ORDER BY `date` ASC;";
поробуй прмиерно так вложенный, это тоже самое что и второй, только Сишное быстродействие
PS SUM(count) AS `count` у тебя два одинакоых значение выдаються... странно... AS `count2`
Re: Запрос из двух и более таблиц
Добавлено: 2008-12-24 11:31:18
zar0ku1
ProFTP писал(а):Код: Выделить всё
SELECT `date`,
SUM(count) AS `count`,
(SELECT SUM(count) FROM `mag2` WHERE `date` LIKE '2008-12-%' and `type`='phone' GROUP BY `date` ORDER BY `date` ASC) AS `count2`,
(SELECT `date` FROM `mag2` WHERE `date` LIKE '2008-12-%' and `type`='phone' GROUP BY `date` ORDER BY `date` ASC) AS `date`
FROM `mag1`
WHERE `date`
LIKE '2008-12-%' and `type`='phone'
GROUP BY `date`
ORDER BY `date` ASC;";
поробуй прмиерно так вложенный, это тоже самое что и второй, только Сишное быстродействие
PS SUM(count) AS `count` у тебя два одинакоых значение выдаються... странно... AS `count2`
Не работает, опять ошибку синтаксиса пишет... не понял про ПС
Re: Запрос из двух и более таблиц
Добавлено: 2008-12-24 11:40:03
ProFTP
zar0ku1 писал(а):ProFTP писал(а):Код: Выделить всё
SELECT `date`,
SUM(count) AS `count`,
(SELECT SUM(count) FROM `mag2` WHERE `date` LIKE '2008-12-%' and `type`='phone' GROUP BY `date` ORDER BY `date` ASC) AS `count2`,
(SELECT `date` FROM `mag2` WHERE `date` LIKE '2008-12-%' and `type`='phone' GROUP BY `date` ORDER BY `date` ASC) AS `date`
FROM `mag1`
WHERE `date`
LIKE '2008-12-%' and `type`='phone'
GROUP BY `date`
ORDER BY `date` ASC;";
поробуй прмиерно так вложенный, это тоже самое что и второй, только Сишное быстродействие
PS SUM(count) AS `count` у тебя два одинакоых значение выдаються... странно... AS `count2`
Не работает, опять ошибку синтаксиса пишет... не понял про ПС
меня такой таблицы нету, проверить не могу
у меня такие примерно запросы бывают часто...
Re: Запрос из двух и более таблиц
Добавлено: 2008-12-24 12:01:18
zar0ku1
ProFTP писал(а): меня такой таблицы нету, проверить не могу
у меня такие примерно запросы бывают часто...
Так чуть подправил, теперь выдает
ну он то как раз и должен выдавать больше, чем одну строку, что ему не нравится
А если задаю конкретную дату
то результатом является
P.S. если делать временную таблицу то:
Код: Выделить всё
mysql> CREATE TABLE tmp SELECT * FROM magazine1 UNION SELECT * FROM magazine2;
Query OK, 1356150 rows affected (3 min 29.16 sec)
Records: 1356150 Duplicates: 0 Warnings: 0
Re: Запрос из двух и более таблиц
Добавлено: 2008-12-25 13:56:28
MAK
`date` LIKE '2008-12-%'
вот енто конечно мощщно. )
Вам необходимо посетить эту страничку
http://dev.mysql.com/doc/refman/5.1/en/ ... types.html
Вообще, я так понимаю, задача не решается одним запросом. Трех-этажные конструкции не в счет. Либо делайте столько запросов, сколько магазинов, далее суммируйте. Либо union, но в скрипте опять же надо будет все суммировать.
Re: Запрос из двух и более таблиц
Добавлено: 2008-12-25 14:15:39
Alex Keda
нормальный запрос.
у меня до сих пор в коде что писал года 4 назад такие юзаются.
и ничё - народ юзает и не жалуется
Re: Запрос из двух и более таблиц
Добавлено: 2008-12-25 22:08:59
zg
задача легко просто и главное быстро решается путём создания временной таблицы
Код: Выделить всё
create temporary table t(
`date` date not null,
`count` int(1) unsigned not null,
primary key (`date`)) type=heap
а дальше тупо
Код: Выделить всё
insert into t select `date`, sum(`count`) from `table` where `date` between '2008-12-01' and '2008-12-31' and `type` = 'phone' group by `date` on duplicate update `t`.`count`=`t`.`count` + `table`.`count`
и так по всем таблицам. А после делай выборку из временной таблицы того, чего тебе надо и как надо.
Это самый быстрый и экономичный вариант.
Re: Запрос из двух и более таблиц
Добавлено: 2008-12-26 11:35:54
zar0ku1
Одним запросом можно реализовать так:
Код: Выделить всё
$query =SELECT `date`, SUM(count) as `count` FROM (SELECT `date`, `count` FROM mag1 UNION ALL SELECT `date`, `count` FROM mag2) as `count` WHERE `date` LIKE '2008-12-%' GROUP BY `date`;
Всем спасибо за участие, ZG отдельно

Re: Запрос из двух и более таблиц
Добавлено: 2008-12-26 12:46:19
zg
при таком запросе временная таблица тоже создаётся, возможно типа исам. Временный тип heap размещается в оперативной памяти, не использует некоторые проверки и работает исключительно быстро. По-сути мускул выполняет все описанные мной действия, только автоматом, но на это тратися дополнительное время, а иногда логика действий нарушается, что ведёт к весьма существенному увеличению времени выполнения.
В общем, прежде чем использовать тот или иной вариант иногда бывает полезным потеститься на большой базе. Ну и про explain не забывать
Кстати покажи чего выдаёт
Код: Выделить всё
EXPLAIN SELECT `date`, SUM(count) as `count` FROM (SELECT `date`, `count` FROM mag1 UNION ALL SELECT `date`, `count` FROM mag2) as `count` WHERE `date` LIKE '2008-12-%' GROUP BY `date`
Re: Запрос из двух и более таблиц
Добавлено: 2008-12-26 13:10:40
zar0ku1
zg писал(а):при таком запросе временная таблица тоже создаётся, возможно типа исам. Временный тип heap размещается в оперативной памяти, не использует некоторые проверки и работает исключительно быстро. По-сути мускул выполняет все описанные мной действия, только автоматом, но на это тратися дополнительное время, а иногда логика действий нарушается, что ведёт к весьма существенному увеличению времени выполнения.
В общем, прежде чем использовать тот или иной вариант иногда бывает полезным потеститься на большой базе. Ну и про explain не забывать
Кстати покажи чего выдаёт
Код: Выделить всё
EXPLAIN SELECT `date`, SUM(count) as `count` FROM (SELECT `date`, `count` FROM mag1 UNION ALL SELECT `date`, `count` FROM mag2) as `count` WHERE `date` LIKE '2008-12-%' GROUP BY `date`
Ну база не сильно большая 300-400мб, строк 1,5-2 миллиона, но запросы по 20с и более просто напрягают

Re: Запрос из двух и более таблиц
Добавлено: 2008-12-26 13:31:15
zg
zar0ku1 писал(а):Ну база не сильно большая 300-400мб, строк 1,5-2 миллиона, но запросы по 20с и более просто напрягают
Код: Выделить всё
stat# du -d1 -h /usr/local/mysql/data | grep /billing
190M /usr/local/mysql/data/billing
stat#
на одну страницу бывает по 8-10 запросов, страница генерится в пределах десятых долей секунды

всё строю на временных таблицах heap и правильных индексах

Re: Запрос из двух и более таблиц
Добавлено: 2008-12-26 13:57:37
zar0ku1
zg писал(а):zar0ku1 писал(а):Ну база не сильно большая 300-400мб, строк 1,5-2 миллиона, но запросы по 20с и более просто напрягают
Код: Выделить всё
stat# du -d1 -h /usr/local/mysql/data | grep /billing
190M /usr/local/mysql/data/billing
stat#
на одну страницу бывает по 8-10 запросов, страница генерится в пределах десятых долей секунды

всё строю на временных таблицах heap и правильных индексах

Интересно все! Написал в личку

Re: Запрос из двух и более таблиц
Добавлено: 2008-12-28 9:08:27
buryanov
а если попробовать так
Код: Выделить всё
select x.date,sum(x.M) from (
(SELECT date, SUM(count) AS count FROM mag1 WHERE date LIKE '2008-12-%' and type=phone)
UNION
(SELECT date, SUM(count) AS count FROM mag2 WHERE date LIKE '2008-12-%' and type=phone) ) x
GROUP BY x.date ORDER BY x.date";
у меня приблизительно так считается тряфик с запросом из 3 таблиц и одновременно по разным поля(входяший и исходящий)
Re: Запрос из двух и более таблиц
Добавлено: 2008-12-28 9:10:49
zar0ku1
buryanov писал(а):а если попробовать так
Код: Выделить всё
select x.date,sum(x.M) from (
(SELECT date, SUM(count) AS count FROM mag1 WHERE date LIKE '2008-12-%' and type=phone)
UNION
(SELECT date, SUM(count) AS count FROM mag2 WHERE date LIKE '2008-12-%' and type=phone) ) x
GROUP BY x.date ORDER BY x.date";
у меня приблизительно так считается тряфик с запросом из 3 таблиц и одновременно по разным поля(входяший и исходящий)
вопрос уже решен, примеры решения написанны выше как с одним запросом, так и с временными таблицами