SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 31.05.2009 19:45:44

pixel
Завсегдатай
Зарегистрирован: 16.04.2009
Сообщений: 39

Помогите составить запрос (очень мудреный)

Нужно сделать выборку аж из 4 таблиц да еще и суммировать некоторые данные:
Таблица 1 - поля Name_Ops, Params (Имя операции и ее параметр - справочник операций)
Таблика 2 - поле Summa (Сумма операции - справочник плановых показателей, он завязан по полю id_counter в первой таблице т.е. id_ops во второй таблице равен какому либо значению id_counter в первой).
Таблица 3 - поле Summa (Сумма операции, вот здесь может быть несколько значений  по разным кодам которые нужно суммировать за определенный период. здесь та же связка, по id_ops-id_counter)
Таблица 4 - поле Fil_Id (Идентификатор филиала, таблица юзеров, в ней есть поле id_User,  оно равно полю User_Id из третьей таблицы, т.е. нужно получить значение Fil_Id при таблица3.User_ID=таблица4.Id_User).
Пример:
Таблица 1:
id_counter Name_Ops     Params
     1          Операция 1    шт.
     2          Операция 2    чел.
     3          Операция 3    руб.
Таблица 2:
Id_Ops        Summa
1                  100
2                  200
3                  300
Таблица 3
Id_ops        Summa     User_Id
     1               5                1
     2              10               1
     2              15               5
     3              10               2
     1              20               3
Таблица 4:
Id_User       Fil_Id 
    1               1
    2               2
    3               3
    4               4
    5               5
Нужно получить что то вроде
Операция 1    шт.       100     25
Операция 2    чел.     200     25
Операция 3    руб.     300     10
и соответственно как то разделить по принадлежности к филиалу, т.е. в запросе добавить что филиал = 3 - и соответственно получить данные только по филиалу 3, юзером которого является опер с идентификатором 3 (так совпало, но не факт что так будет). А так же, хотелось бы запрос и по всем филиалам но что бы данные в разбивке по каждому шли. У меня просто мозгов не хватает все вот это сформировать в что то понятное. Хелп, плиз.

Отредактированно pixel (31.05.2009 20:28:17)

Неактивен

 

#2 01.06.2009 04:43:38

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

Re: Помогите составить запрос (очень мудреный)

SELECT t1.Name_Ops, t1.Params, t2.Summa, SUM(t3.Summa), t4.Fil_Id
FROM t1
JOIN t2 ON (t1.id_counter = t2.Id_Ops)
JOIN t3 ON (t1.id_counter = t3.Id_Ops)
JOIN t4 ON (t3.User_Id = t4.Id_User)
GROUP BY t1.id_counter, t4.Fil_Id WITH ROLLUP

Неактивен

 

#3 01.06.2009 20:03:27

pixel
Завсегдатай
Зарегистрирован: 16.04.2009
Сообщений: 39

Re: Помогите составить запрос (очень мудреный)

я попробовал добавить свои данные в запрос, но что то даже в консоли mysql этот запрос не работает:

select sprav_ops.name_ops,sprav_ops.params,plan.summa,sum(information.summa),users.Fil_Id from sprav_ops JOIN plan ON (sprav_ops.id_ops=plan.Id_Ops) JOIN information ON (sprav_ops.id_ops = information.Id_ops) JOIN users ON (information.User_Id = users.Id_User) GROUP BY sprav_ops.id_ops, users.Fil_Id WITH ROLLUP

говорит: Error 1064 - SQL syntax...
что тут не так, я только поля и имена таблиц добавил (и поменял id_counter на id_ops т.к. второе это идентификатор операции а первое просто номер записи - а их может быть куча)

Неактивен

 

#4 01.06.2009 20:28:11

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

Re: Помогите составить запрос (очень мудреный)

А полный текст ошибки? smile

Неактивен

 

#5 01.06.2009 20:37:30

pixel
Завсегдатай
Зарегистрирован: 16.04.2009
Сообщений: 39

Re: Помогите составить запрос (очень мудреный)

c:\mysql\bin>mysql.exe <124.sql
ERROR 1064 at line 2: You have an error in your SQL syntax near 'ON (sprav_ops.id_ops=plan.Id_ops) JOIN information ON (sprav_ops.id_ops=inform' at line 1

(в первой строке идет use tablename; во второй запрос)
Позже:
Может длина строки ограничена?

Отредактированно pixel (01.06.2009 20:47:12)

Неактивен

 

#6 01.06.2009 20:53:54

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

Re: Помогите составить запрос (очень мудреный)

Странно. Никаких кавычек/спецсимволов/еще чего-то нету? Попробуйте заключить `plan` в обратные
кавычки (которые там, где буква ё).

Неактивен

 

#7 01.06.2009 21:01:49

pixel
Завсегдатай
Зарегистрирован: 16.04.2009
Сообщений: 39

Re: Помогите составить запрос (очень мудреный)

обратные кавычки не помогли. кроме скобок, точет, запятых, символов подчекривания и точки с запятой - никаких спец символов нет.

Неактивен

 

#8 01.06.2009 21:54:41

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

Re: Помогите составить запрос (очень мудреный)

«Я Вам не верю» ©

[aquatica] root test > create table sprav_ops(id_counter int, name_ops varchar(20), params varchar(20));
Query OK, 0 rows affected (0,08 sec)

[aquatica] root test > insert sprav_ops values (1, 'op 1', 'items');
Query OK, 1 row affected (0,01 sec)

[aquatica] root test > insert sprav_ops values (2, 'op 2', 'humans');
Query OK, 1 row affected (0,00 sec)

[aquatica] root test > insert sprav_ops values (3, 'op 3', 'roubles');
Query OK, 1 row affected (0,00 sec)

[aquatica] root test > create table plan (id_ops int, summa int);
Query OK, 0 rows affected (0,04 sec)

[aquatica] root test > insert plan values (1,100), (2,200), (3,300);
Query OK, 3 rows affected (0,00 sec)
Records: 3  Duplicates: 0  Warnings: 0

[aquatica] root test > create table information (id_ops int, summa int, user_id int);
Query OK, 0 rows affected (0,03 sec)

[aquatica] root test > insert information values (1,5,1),(2,10,1),(2,15,5),(3,10,2),(1,20,3);
Query OK, 5 rows affected (0,01 sec)
Records: 5  Duplicates: 0  Warnings: 0

[aquatica] root test > create table users (id_user int, fil_id int);
Query OK, 0 rows affected (0,03 sec)

[aquatica] root test > insert users values (1,1),(2,2),(3,3),(4,4),(5,5);
Query OK, 5 rows affected (0,00 sec)
Records: 5  Duplicates: 0  Warnings: 0

[aquatica] root test > select sprav_ops.name_ops,sprav_ops.params,plan.summa,sum(information.summa),users.Fil_Id from sprav_ops JOIN plan ON (sprav_ops.id_counter=plan.Id_Ops) JOIN information ON (sprav_ops.id_counter = information.Id_ops) JOIN users ON (information.User_Id = users.Id_User) GROUP BY sprav_ops.id_counter, users.Fil_Id WITH ROLLUP;
+----------+---------+-------+------------------------+--------+
| name_ops | params  | summa | sum(information.summa) | Fil_Id |
+----------+---------+-------+------------------------+--------+
| op 1     | items   |   100 |                      5 |      1 |
| op 1     | items   |   100 |                     20 |      3 |
| op 1     | items   |   100 |                     25 |   NULL |
| op 2     | humans  |   200 |                     10 |      1 |
| op 2     | humans  |   200 |                     15 |      5 |
| op 2     | humans  |   200 |                     25 |   NULL |
| op 3     | roubles |   300 |                     10 |      2 |
| op 3     | roubles |   300 |                     10 |   NULL |
| op 3     | roubles |   300 |                     60 |   NULL |
+----------+---------+-------+------------------------+--------+
9 rows in set (0,03 sec)

Неактивен

 

#9 02.06.2009 18:54:16

pixel
Завсегдатай
Зарегистрирован: 16.04.2009
Сообщений: 39

Re: Помогите составить запрос (очень мудреный)

вы не поверите! скопировал ваш текст, создал таблицы как и у вас в примере. скопировал ваш же код отбора - в итоге та же самая ошибка! у меня такое ощущение, может версия mysql играет роль? моя версия 3.23.54
Позже: Может есть какой нить другой вариант? пусть более ресурсоемкий но работоспособный - мне главное показать что страницы работают, а там можно будет всегда отточить другой вариант.

Отредактированно pixel (02.06.2009 19:18:49)

Неактивен

 

#10 03.06.2009 15:56:57

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

Re: Помогите составить запрос (очень мудреный)

Ой-ё. 3.23! smile Они еще живы! big_smile

SELECT sprav_ops.name_ops,sprav_ops.params,plan.summa,sum(information.summa),users.Fil_Id
FROM sprav_ops, plan, information, users
WHERE (sprav_ops.id_counter=plan.Id_Ops) AND (sprav_ops.id_counter = information.Id_ops) AND (information.User_Id = users.Id_User)
GROUP BY sprav_ops.id_counter, users.Fil_Id WITH ROLLUP;

Будет ли работать WITH ROLLUP — не уверен, попробуйте smile
P.S. Со времен 3.23 прошло и ушло в небытие уже три больших ветки, сейчас стабильная 5.1. Попробуйте? smile

Неактивен

 

#11 04.06.2009 20:30:30

pixel
Завсегдатай
Зарегистрирован: 16.04.2009
Сообщений: 39

Re: Помогите составить запрос (очень мудреный)

подскажите, что я делаю не так? Вот данные:
id_counter    Date_Ops    Id_Ops    Summa    User_Id
27    2009-06-03    10    1000.00    11
26    2009-06-03    1    11.00    11
25    2009-06-11    8    10.00    8
24    2009-06-11    4    5.00    8
23    2009-06-01    7    3.00    8
22    2009-06-01    5    2.00    8
21    2009-06-01    1    4.00    8
16    2009-05-30    1    10.00    8
17    2009-05-30    5    9.00    8
18    2009-05-30    14    8.00    8

Делаю запрос (похоже что то с ним)
select a.name_ops, a.params, b.summa, sum(c.summa), d.id_user from sprav_ops a, plan b, information c, users d where a.id_ops=b.id_ops and b.id_ops=c.id_ops and c.user_id=d.id_user group by c.id_ops, c.user_id;

Получаю ответ:
name_ops    params    summa    sum(c.summa)    id_user
Операция 1    шт.    100.00    28.00    8
Операция 1    шт.    100.00    22.00    11
Операция 4    шт.    400.00    10.00    8
Операция 5    шт.    500.00    22.00    8
Операция 7    шт.    700.00    6.00    8
Операция 8    шт.    800.00    20.00    8
Операция 10    руб.    1000.00    2000.00    11
Операция 14    шт.    1400.00    16.00    8

В итоге почему то данные удвоенные получаются. Как мне получить правильные суммы и в разбивке по идентификатору юзера?

Неактивен

 

#12 04.06.2009 21:18:36

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

Re: Помогите составить запрос (очень мудреный)

Ну, во-первых, попробуйте избавиться от лишних таблиц (users). Если что-то не нужно,
то не нужно это упоминать — будет работать быстрее.

Во-вторых, попробуйте избавиться от объединений с другими таблицами (ведь для группировки
Вам тут достаточно одной таблички information). После этого подключайте таблички по одной
и смотрите, как изменяется результат. Скорее всего, в какой-то табличке каждый пользователь
указан дважды. Две одинаковые строки в сумме дают двойной результат.

Неактивен

 

#13 04.06.2009 21:52:28

pixel
Завсегдатай
Зарегистрирован: 16.04.2009
Сообщений: 39

Re: Помогите составить запрос (очень мудреный)

тут нет лишних таблиц, по users проверяется принадлежность данных определенному юзеру, который в свою очередь принадлежит определенному филиалу. (кстати, я пробовал и отключать "ненужные таблицы" но все равно результат суммируется). Что до того, что в некоторых таблицах две одинаковые строчки то все данные берутся именно из таблицы information в которой может повторятся куча данных, но все они разделяются по юзерам. т.е. двух абсолютно одинаковых строк там быть не может. и опять же, даже если найти две идентичные строки, то в примерах таблиц выше, результат удвоенный идет по каждой строке!

Неактивен

 

#14 04.06.2009 21:59:26

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

Re: Помогите составить запрос (очень мудреный)

Если данные не секретные — приложите файлики дампов табличек? Очень сложно судить
по неименованным табличкам, набитым в HTML smile

Неактивен

 

#15 07.06.2009 13:16:43

pixel
Завсегдатай
Зарегистрирован: 16.04.2009
Сообщений: 39

Re: Помогите составить запрос (очень мудреный)

с этим запросом справился:
select a.name_ops, a.params, b.summa, sum(c.summa), d.fil_id, e.fil_name, d.LastName from sprav_ops a, plan b, information c, users d, filials e where c.user_Id=d.id_user and d.fil_id=b.fil_no and e.fil_no=b.fil_no and a.id_ops=c.id_ops and b.id_ops=c.id_ops group by c.user_id, c.id_ops order by c.user_id, c.id_ops;

Подскажите, вот в этой выборке у меня добавлены фамилии операторов. как мне изменить запрос, что бы фамилии операторов (ну или их идентификаоры)  стали названиями дополнительных столбцов, в которых содержались бы суммированные данные конкретно по ним? наверное это очень сложно, и мне придется средсвами PHP как то это обрабатывать.

Позже: вопрос снимаю, сделал на PHP через массивы.

Отредактированно pixel (07.06.2009 22:35:19)

Неактивен

 

#16 07.06.2009 23:49:05

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Помогите составить запрос (очень мудреный)

Подскажите, вот в этой выборке у меня добавлены фамилии операторов. как мне изменить запрос, что бы фамилии операторов (ну или их идентификаоры)  стали названиями дополнительных столбцов, в которых содержались бы суммированные данные конкретно по ним? наверное это очень сложно, и мне придется средсвами PHP как то это обрабатывать.

Можно, но очень геморно. Лучше действительно через клиент, как Вы и сделали.

Неактивен

 

Board footer

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