SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 15.07.2008 02:04:04

coin
Гуру
Зарегистрирован: 15.07.2008
Сообщений: 66

Выборка суммы

Во вложении дамп таблиц.

Использую примерно такой запрос:

Код:

SELECT `id`, `name`, COALESCE(`tbl2_sum`.`sum`, 0) AS `sum` FROM `tbl1` LEFT JOIN (SELECT `pid`, SUM(`sum`) AS `sum` FROM `tbl2` GROUP BY `pid`) AS `tbl2_sum` ON `tbl2_sum`.`pid` = `tbl1`.`id`

Как избавиться от вложенного запроса, получая тот же результат выборки?

Неактивен

 

#2 15.07.2008 09:20:18

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Выборка суммы

Вложения нету, к сожалению.

А способ "в лоб" чем не подходит? Честно говоря, не вижу, почему бы ему
выдавать другой результат...

SELECT t1.id, t1.name, SUM(t2.sum)
FROM tbl1 t1
LEFT JOIN tbl2 t2 ON t2.pid = t1.id
GROUP BY t2.pid

Неактивен

 

#3 15.07.2008 09:26:43

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Выборка суммы

Вроде бы в лоб не проходит. Может быть несколько записей из t1 для одной записи из t2, поэтому сумма "в лоб" будет больше в ряде случаев.

Неактивен

 

#4 15.07.2008 09:30:26

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Выборка суммы

Не понимаю. Группировка идет независимо все равно. Можешь привести пример
с данными?

Неактивен

 

#5 15.07.2008 09:36:07

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Выборка суммы


mysql> create table a (a int);
mysql> create table b (b int, c int);
mysql> insert into a values (1),(1),(1);
mysql> insert into b values (1,2),(1,3),(2,3);
mysql> select a.a,sum(b.c) from a left join b on a.a=b.b group by b.b;
+------+----------+
| a    | sum(b.c) |
+------+----------+
|    1 |       15 |
+------+----------+
1 row in set (0.00 sec)
mysql> select b.b,sum(b.c) from b group by b.b;
+------+----------+
| b    | sum(b.c) |
+------+----------+
|    1 |        5 |
|    2 |        3 |
+------+----------+
2 rows in set (0.00 sec)
 

Неактивен

 

#6 15.07.2008 09:59:25

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Выборка суммы

Да, согласен. Получается, что группируем по a, если одновременно группировать
и присоединять sad

Без подзапроса не удается. Пока по крайней мере sad

А в оригинальных данных нету, случаем, уникальности на первой табличке по id? wink

Неактивен

 

#7 15.07.2008 14:27:18

coin
Гуру
Зарегистрирован: 15.07.2008
Сообщений: 66

Re: Выборка суммы

Извиняюсь, дамп вроде крепил, но он куда то потерялся. Сейчас ещё раз пробуем.

UPD
Кажется понял в чём дело, это из-за "предварительного просмотра" upload-форма сбрасывается.

UPD2
Ещё лучше...
Error: Unable to move file from: /home/sqlinfo.ru/tmp/phpe6eYRJ to /home/sqlinfo.ru/htdocs/forum/attach_dir/9f1a745fec1cf0394e212e87b2586e42/7315c21d0a86c02e86601222425df523.attach.

UPD3
Сюда выложил

Неактивен

 

#8 15.07.2008 14:31:24

coin
Гуру
Зарегистрирован: 15.07.2008
Сообщений: 66

Re: Выборка суммы

paulus написал:

А в оригинальных данных нету, случаем, уникальности на первой табличке по id? wink

Случайно есть smile `id` в обоих таблицах - первичные ключи.

Неактивен

 

#9 15.07.2008 14:34:51

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Выборка суммы

Таки уникальный ключик есть! smile

Код:

mysql> SELECT tbl1.id, name, SUM(IFNULL(tbl2.sum,0)) FROM tbl1 LEFT JOIN tbl2 ON tbl2.pid = tbl1.id GROUP BY pid, id ORDER BY id;
+----+-----------------+-------------------------+
| id | name            | SUM(IFNULL(tbl2.sum,0)) |
+----+-----------------+-------------------------+
|  1 | запись 01       |                     177 | 
|  2 | запись 02       |                     267 | 
|  3 | запись 03       |                     158 | 
|  4 | запись 04       |                       0 | 
|  5 | запись 05       |                       0 | 
|  6 | запись 06       |                     193 | 
|  7 | запись 07       |                     258 | 
|  8 | запись 08       |                       0 | 
|  9 | запись 09       |                     291 | 
| 10 | запись 10       |                       0 | 
+----+-----------------+-------------------------+
10 rows in set (0.00 sec)

Неактивен

 

#10 15.07.2008 14:54:32

coin
Гуру
Зарегистрирован: 15.07.2008
Сообщений: 66

Re: Выборка суммы

Странно.. всегда представлял, что подобный запрос выберет кол-во записей, равное кол-ву записей в таблице `tbl1` с прикреплением одной произвольной записи с `tbl2`.`pid` = `tbl1`.`id` из `tbl2`. Теперь маленько запутался в устройстве JOIN'ов.

SELECT `tbl1`.`id`, `name` ,`tbl2`.`id` FROM `tbl1` LEFT JOIN `tbl2` ON `tbl2`.`pid` = `tbl1`.`id`

Неактивен

 

#11 15.07.2008 15:01:06

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Выборка суммы

Нет, не одной произвольной, а всех доступных по условию объединения.

Неактивен

 

#12 15.07.2008 19:27:23

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Выборка суммы

Возможно файл не прикрепился из-за ограничения по размеру

Неактивен

 

#13 15.07.2008 21:29:56

coin
Гуру
Зарегистрирован: 15.07.2008
Сообщений: 66

Re: Выборка суммы

rgbeast написал:

Возможно файл не прикрепился из-за ограничения по размеру

Вот этот файл крепил, 2.3 кб. Не думаю, что у вас такое маленькое ограничение..

Сейчас попробовал, тоже самое:

Код:

An error was encountered
Error: Unable to move file from: /home/sqlinfo.ru/tmp/phpr9aJvN to /home/sqlinfo.ru/htdocs/forum/attach_dir/9f1a745fec1cf0394e212e87b2586e42/11130d88ad2d98c894744f8d2ca61a89.attach.

Спасибо за ответы, хороший форум smile

Отредактированно coin (15.07.2008 21:31:07)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson