Задавайте вопросы, мы ответим
Вы не зашли.
Нужно сделать выборку аж из 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)
Неактивен
Неактивен
я попробовал добавить свои данные в запрос, но что то даже в консоли 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 т.к. второе это идентификатор операции а первое просто номер записи - а их может быть куча)
Неактивен
А полный текст ошибки?
Неактивен
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)
Неактивен
Странно. Никаких кавычек/спецсимволов/еще чего-то нету? Попробуйте заключить `plan` в обратные
кавычки (которые там, где буква ё).
Неактивен
обратные кавычки не помогли. кроме скобок, точет, запятых, символов подчекривания и точки с запятой - никаких спец символов нет.
Неактивен
«Я Вам не верю» ©
[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)
Неактивен
вы не поверите! скопировал ваш текст, создал таблицы как и у вас в примере. скопировал ваш же код отбора - в итоге та же самая ошибка! у меня такое ощущение, может версия mysql играет роль? моя версия 3.23.54
Позже: Может есть какой нить другой вариант? пусть более ресурсоемкий но работоспособный - мне главное показать что страницы работают, а там можно будет всегда отточить другой вариант.
Отредактированно pixel (02.06.2009 19:18:49)
Неактивен
Ой-ё. 3.23! Они еще живы!
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 — не уверен, попробуйте
P.S. Со времен 3.23 прошло и ушло в небытие уже три больших ветки, сейчас стабильная 5.1. Попробуйте?
Неактивен
подскажите, что я делаю не так? Вот данные:
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
В итоге почему то данные удвоенные получаются. Как мне получить правильные суммы и в разбивке по идентификатору юзера?
Неактивен
Ну, во-первых, попробуйте избавиться от лишних таблиц (users). Если что-то не нужно,
то не нужно это упоминать — будет работать быстрее.
Во-вторых, попробуйте избавиться от объединений с другими таблицами (ведь для группировки
Вам тут достаточно одной таблички information). После этого подключайте таблички по одной
и смотрите, как изменяется результат. Скорее всего, в какой-то табличке каждый пользователь
указан дважды. Две одинаковые строки в сумме дают двойной результат.
Неактивен
тут нет лишних таблиц, по users проверяется принадлежность данных определенному юзеру, который в свою очередь принадлежит определенному филиалу. (кстати, я пробовал и отключать "ненужные таблицы" но все равно результат суммируется). Что до того, что в некоторых таблицах две одинаковые строчки то все данные берутся именно из таблицы information в которой может повторятся куча данных, но все они разделяются по юзерам. т.е. двух абсолютно одинаковых строк там быть не может. и опять же, даже если найти две идентичные строки, то в примерах таблиц выше, результат удвоенный идет по каждой строке!
Неактивен
Если данные не секретные — приложите файлики дампов табличек? Очень сложно судить
по неименованным табличкам, набитым в HTML
Неактивен
с этим запросом справился:
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)
Неактивен
Подскажите, вот в этой выборке у меня добавлены фамилии операторов. как мне изменить запрос, что бы фамилии операторов (ну или их идентификаоры) стали названиями дополнительных столбцов, в которых содержались бы суммированные данные конкретно по ним? наверное это очень сложно, и мне придется средсвами PHP как то это обрабатывать.
Можно, но очень геморно. Лучше действительно через клиент, как Вы и сделали.
Неактивен