Несколько полезных SQL запросов
Запрос должен показывать список сумм выставленных счетов для членов определенных групп.
К примеру членам групп корпоративные клиенты(110) интернет(140) на их договоры(у некоторых больше одного) выставлены такие счета такие то, каждый на такую то сумму.
В выводе нужны следующие поля:
-users.full_name
-accounts.id
-sum(invoice_entry.sum_cost)
-invoice.invoice_date
-invoice.is_payed
-invoice.is_printed
Типа такого на выходе:
ООО Лютик,110011,123руб,01.01.2016,0,1
ООО Лютик,110012,1234руб,01.01.2016,0,1
ИП Ромашкин, 110013,12руб,01.01.2016,1,1
ООО Роза, 110014,122руб,02.01.2016,0,0
К примеру членам групп корпоративные клиенты(110) интернет(140) на их договоры(у некоторых больше одного) выставлены такие счета такие то, каждый на такую то сумму.
В выводе нужны следующие поля:
-users.full_name
-accounts.id
-sum(invoice_entry.sum_cost)
-invoice.invoice_date
-invoice.is_payed
-invoice.is_printed
Типа такого на выходе:
ООО Лютик,110011,123руб,01.01.2016,0,1
ООО Лютик,110012,1234руб,01.01.2016,0,1
ИП Ромашкин, 110013,12руб,01.01.2016,1,1
ООО Роза, 110014,122руб,02.01.2016,0,0
Вы сами себе противоречите, если нужен вывод типа примера, то все просто:kara писал(а):Запрос должен показывать список сумм выставленных счетов для членов определенных групп.
Типа такого на выходе:
ООО Лютик,110011,123руб,01.01.2016,0,1
ООО Лютик,110012,1234руб,01.01.2016,0,1
ИП Ромашкин, 110013,12руб,01.01.2016,1,1
ООО Роза, 110014,122руб,02.01.2016,0,0
Код: Выделить всё
SELECT
u.full_name, a.id, ie.sum_cost,FROM_UNIXTIME(i.invoice_date),i.is_payed,i.is_printed
FROM users u, users_groups_link ugl, invoices i, accounts a, invoice_entry ie, users_accounts ua
WHERE
u.id=ugl.user_id
AND ua.uid=u.id
AND ua.account_id=a.id
AND i.account_id=a.id
AND ie.invoice_id=i.id
AND u.is_deleted=0
AND ua.is_deleted=0
AND a.is_deleted=0
AND ie.sum_cost > '0'
AND (ugl.group_id=110 OR ugl.group_id=140);
Код: Выделить всё
SELECT
u.full_name, a.id, SUM(ie.sum_cost),FROM_UNIXTIME(i.invoice_date),i.is_payed,i.is_printed
FROM users u, users_groups_link ugl, invoices i, accounts a, invoice_entry ie, users_accounts ua
WHERE
u.id=ugl.user_id
AND ua.uid=u.id
AND ua.account_id=a.id
AND i.account_id=a.id
AND ie.invoice_id=i.id
AND u.is_deleted=0
AND ua.is_deleted=0
AND a.is_deleted=0
AND ie.sum_cost > '0'
AND (ugl.group_id=110 OR ugl.group_id=140)
GROUP BY a.id;
Ну тогда перепишите с IN, не вижу особых сложностей, пример без суммирования, смысл такой, что изначально делаем выборку, только по юзерам входящим в обе группы:kara писал(а):Косяк в том, что приведенные вами запросы показывают данные НЕ только для тех, кто является членом групп 110 и 140, но и остальных, которые состоят хотя бы в одной из этих групп(тех у кого 110 и 130 или тех у кого 120 и 140) и в итоге получается месиво из физиков, юриков, интернет, телефон....
Код: Выделить всё
SELECT
u.full_name, a.id, ie.sum_cost,FROM_UNIXTIME(i.invoice_date),i.is_payed,i.is_printed
FROM
users u, users_groups_link ugl, invoices i, accounts a, invoice_entry ie, users_accounts ua
WHERE
u.id=ugl.user_id
AND ua.uid=u.id
AND ua.account_id=a.id
AND i.account_id=a.id
AND ie.invoice_id=i.id
AND u.is_deleted=0
AND ua.is_deleted=0
AND a.is_deleted=0
AND ie.sum_cost > '0'
AND u.id IN
(SELECT
u.id
FROM users u, users_groups_link ugl
WHERE
u.id=ugl.user_id
AND (ugl.group_id=131 OR ugl.group_id=130)
GROUP BY
u.id
HAVING COUNT(u.id)>1);
Не верю Там изначально выполняется то, что в IN оно отрабатывает достаточно быстро, а уже только по тем юзерам что туда попали выполняется основой запрос с джоинами, у меня есть запросы на пару страниц текста, если распечатать 12 шрифтом и то 3 минуты не выполняются. Вот выполните запрос как есть и покажите время его обработки. Вот у меня:kara писал(а):Да эт конечно просто, я такой запрос написал изначально себе
Но он выполняется по три минуты...
Код: Выделить всё
11040 rows in set (0.06 sec)
Rico-X писал(а): Вот выполните запрос как есть и покажите время его обработки. Вот у меня:Код: Выделить всё
11040 rows in set (0.06 sec)
Мда, на стандартных индексах и не самом передовом железе драматическая разница...84870 rows in set (57.86 sec)
При этом если отдельно от друг друга:
Код: Выделить всё
SELECT
u.id
FROM users u, users_groups_link ugl
WHERE
u.id=ugl.user_id
AND (ugl.group_id=110 OR ugl.group_id=130)
AND u.is_deleted=0
GROUP BY
u.id
HAVING COUNT(u.id)>1
И:123 rows in set (0.03 sec)
Код: Выделить всё
SELECT
u.full_name, a.id, ie.sum_cost,FROM_UNIXTIME(i.invoice_date),i.is_payed,i.is_printed
FROM
users u, users_groups_link ugl, invoices i, accounts a, invoice_entry ie, users_accounts ua
WHERE
u.id=ugl.user_id
AND ua.uid=u.id
AND ua.account_id=a.id
AND i.account_id=a.id
AND ie.invoice_id=i.id
AND u.is_deleted=0
AND ua.is_deleted=0
AND a.is_deleted=0
AND ie.sum_cost > '0'
AND ugl.group_id=110;
31060 rows in set (1.10 sec)
Что-то не так в настройке сервера, не должно быть такой огромной разницы, прогоните проверку хотя-бы https://raw.githubusercontent.com/major ... qltuner.pl что-то где-то не кешируется в памяти.
Никак. политики списания теперь привязаны к переодическим сервисным линкам, наблюдать можно их в таблице periodic_service_links.policy_idMorbid писал(а):А кто может подсказать, каким чудесным полями сейчас связаны политики списания с лицевыми счетами?
То есть в оригинале хотелось бы получить данные
лицевой счет <-> ид_политики списания.
P.S. Мне хотя бы понять через какие таблицы\поля есть связь. Запрос написать не беда.
Без конкретизации видится как счетчик видаVans писал(а):А кто-нибудь знает как вывести пользователей у которых подключен один тариф и при этом не подключен другой?
Код: Выделить всё
GROUP BY
users.id
HAVING COUNT(users.id)=1