powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Переделать запрос
11 сообщений из 11, страница 1 из 1
Переделать запрос
    #39151897
motoroller1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть замороченный запросик, он сейчас полностью рабочий. Основной смысл: вывожу всех менеджеров у которых есть или нет клиенты с продажами, важно вывести за текущий и предыдущий месяц суммы на которые были продажи.

Собственно запрос работает, но чувствую коряво это с подзапросами.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SELECT SQL_CALC_FOUND_ROWS `u`.`id`, `u`.`name`, `u`.`email`, `u`.`phone`,
					`a`.`symbol` AS `symbol`, `u`.`phone`, IFNULL(`u2`.`name`, 'нет менеджера') AS `manager`,
					
					(SELECT IFNULL(SUM(`sum`), 0) FROM `sales` WHERE `dealer` = `u`.`id` AND 
						MONTH(`date`) = MONTH(DATE_ADD(NOW(), INTERVAL -1 MONTH)) AND YEAR(`date`) = YEAR(DATE_ADD(NOW(), INTERVAL -1 MONTH))) AS `prevSum`,
					
					(SELECT IFNULL(SUM(`sum`), 0) FROM `sales` WHERE `dealer` = `u`.`id` AND 
						MONTH(`date`) = MONTH(NOW()) AND YEAR(`date`) = YEAR(NOW())) AS `currentSum`,
					
					(SELECT `sale` FROM `reward` WHERE sum <= `prevSum` ORDER BY `sum` DESC LIMIT 1) AS `prevBonus`,
					
					(SELECT `sale` FROM `reward` WHERE sum <= `currentSum` ORDER BY `sum` DESC LIMIT 1) AS `currentBonus`,
					
					(SELECT MAX(`sum`) FROM `reward`) AS `maxSum`,
					
					(SELECT `sum` - `currentSum` FROM `reward` WHERE `sum` >= `currentSum` ORDER BY `sum` ASC LIMIT 1)  AS `nextBonusSum`,
										
					(CASE 
						WHEN `u`.`status` = 1 then 'активный'
						WHEN `u`.`status` = 0 then 'не активный'
						WHEN `u`.`status` = 2 then 'черный список'
					END) AS `status`
					
					FROM `activities` AS `a`, `users` AS `u`
					
					LEFT JOIN `users` AS `u2` ON (`u2`.`id` = `u`.`manager`) 
					
					WHERE `u`.`type` = `a`.`id` AND `u`.`rights` = 33



Попробовал сделать частично через left join

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
SELECT SQL_CALC_FOUND_ROWS `u`.`id`, `u`.`name`, `u`.`email`, `u`.`phone`,
					`a`.`symbol` AS `symbol`, `u`.`phone`, IFNULL(`u2`.`name`, 'нет менеджера') AS `manager`,
					
					
					IFNULL(SUM(`ps`.`sum`), 0) AS `prevSum`,
					
					IFNULL(SUM(`cs`.`sum`), 0) AS `currentSum`,
					
					
					(SELECT `sale` FROM `reward` WHERE sum <= IFNULL(SUM(`ps`.`sum`), 0) ORDER BY `sum` DESC LIMIT 1) AS `prevBonus`,
					
					(SELECT `sale` FROM `reward` WHERE sum <= IFNULL(SUM(`cs`.`sum`), 0) ORDER BY `sum` DESC LIMIT 1) AS `currentBonus`,
					
					(SELECT MAX(`sum`) FROM `reward`) AS `maxSum`,
					
					(SELECT `sum` - IFNULL(SUM(`cs`.`sum`), 0) FROM `reward` WHERE `sum` >= IFNULL(SUM(`cs`.`sum`), 0) ORDER BY `sum` ASC LIMIT 1)  AS `nextBonusSum`,
										
					(CASE 
						WHEN `u`.`status` = 1 then 'активный'
						WHEN `u`.`status` = 0 then 'не активный'
						WHEN `u`.`status` = 2 then 'черный список'
					END) AS `status`
					
					FROM `activities` AS `a`, `users` AS `u`
					
					LEFT JOIN `users` AS `u2` ON (`u2`.`id` = `u`.`manager`) 
					
					LEFT JOIN `sales` AS `cs` ON (`cs`.`dealer` = `u`.`id` AND MONTH(`cs`.`date`) = MONTH(NOW()) AND YEAR(`cs`.`date`) = YEAR(NOW())) 
					
					LEFT JOIN `sales` AS `ps` ON (`ps`.`dealer` = `u`.`id` AND MONTH(`ps`.`date`) = MONTH(DATE_ADD(NOW(), INTERVAL -1 MONTH)) AND YEAR(`ps`.`date`) = YEAR(DATE_ADD(NOW(), INTERVAL -1 MONTH))) 
					
					WHERE `u`.`type` = `a`.`id` AND `u`.`rights` = 33 GROUP BY `u`.`id`



Вроде бы все просто добавил группировку и добавил условия в join, но заметил такую тему, что суммы начали удваиваться (и так далее) по сравнению с первым вариантом,

подскажите, стоит ли делать через Join или первый вариант пойдет? И если делать через Join как сделать чтобы не удваивалось?
...
Рейтинг: 0 / 0
Переделать запрос
    #39151899
motoroller1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Описался вывожу Экспертов, но собственно они у меня с менеджерами в одной таблице и только отличаются кодами
...
Рейтинг: 0 / 0
Переделать запрос
    #39151959
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motoroller1983если делать через Join как сделать чтобы не удваивалось?
Сперва подзапросами считать суммы, а только потом JOIN.
...
Рейтинг: 0 / 0
Переделать запрос
    #39152090
motoroller1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не совсем понятно, а можно примерчик))
...
Рейтинг: 0 / 0
Переделать запрос
    #39152103
motoroller1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
SELECT SQL_CALC_FOUND_ROWS `u`.`id`, `u`.`name`, `u`.`email`, `u`.`phone`,
					`a`.`symbol` AS `symbol`, `u`.`phone`, IFNULL(`u2`.`name`, 'нет менеджера') AS `manager`,
					
					
					`ps`.`prevSum`,
					
					`cs`.`currentSum`,
		
					
					(SELECT `sale` FROM `reward` WHERE sum <= `ps`.`prevSum` ORDER BY `sum` DESC LIMIT 1) AS `prevBonus`,
					
					(SELECT `sale` FROM `reward` WHERE sum <= `cs`.`currentSum` ORDER BY `sum` DESC LIMIT 1) AS `currentBonus`,
					
					(SELECT MAX(`sum`) FROM `reward`) AS `maxSum`,
					
					(SELECT `sum` - `cs`.`currentSum` FROM `reward` WHERE `sum` >= `cs`.`currentSum` ORDER BY `sum` ASC LIMIT 1)  AS `nextBonusSum`,
										
					(CASE 
						WHEN `u`.`status` = 1 then 'активный'
						WHEN `u`.`status` = 0 then 'не активный'
						WHEN `u`.`status` = 2 then 'черный список'
					END) AS `status`
					
					FROM `activities` AS `a`, `users` AS `u`
					
					LEFT JOIN `users` AS `u2` ON (`u2`.`id` = `u`.`manager`) 
					
					LEFT JOIN (
					
						SELECT IFNULL(SUM(`sum`), 0) AS `prevSum`, `dealer`
						FROM `sales` WHERE
						MONTH(`date`) = MONTH(DATE_ADD(NOW(), INTERVAL -1 MONTH)) AND YEAR(`date`) = YEAR(DATE_ADD(NOW(), INTERVAL -1 MONTH))
					
					) AS `ps` ON (`ps`.`dealer` = `u`.`id`)
					
					
					LEFT JOIN (
					
						SELECT IFNULL(SUM(`sum`), 0) AS `currentSum`, `dealer`
						FROM `sales` WHERE
						MONTH(`date`) = MONTH(NOW()) AND YEAR(`date`) = YEAR(NOW())
					
					) AS `cs` ON (`cs`.`dealer` = `u`.`id`)
					
										
					
					
					WHERE `u`.`type` = `a`.`id` AND `u`.`rights` = 33 GROUP BY `u`.`id`



Сделал внутри группировку, тогда выдает неверные данные ((
...
Рейтинг: 0 / 0
Переделать запрос
    #39152183
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motoroller1983а можно примерчик
Я понимаю, что пользоваться поиском - это моветон... но хотя бы список тем форума просмотреть что помешало?
Два JOINa и SUM() - помогите скорректировать запрос
...
Рейтинг: 0 / 0
Переделать запрос
    #39152263
motoroller1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT `u`.`email`, `u`.`name`, `u2`.`name` AS `manager`, `psale`.`sale` AS `prevBonus`

FROM  `users` AS `u`
					
LEFT JOIN `users` AS `u2` ON (`u2`.`id` = `u`.`manager`) 

LEFT JOIN (
						SELECT `sale`, `sum` FROM `reward` ORDER BY `sum` DESC LIMIT 1
					) AS `psale` ON (`psale`.`sum` <= 16200)	

WHERE `u`.`rights` = 33

GROUP BY `u`.`id`



В общем все получилось по основному запросу, но есть кусок который все время неверно выполняется
prevBonus все время 0

Когда я делал с подзапросами

Код: sql
1.
(SELECT `sale` FROM `reward` WHERE sum <= `prevSum` ORDER BY `sum` DESC LIMIT 1) AS `prevBonus`,



Все считалось корректно
...
Рейтинг: 0 / 0
Переделать запрос
    #39152334
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motoroller1983есть кусок который все время неверно выполняется
Он выполняется верно - сервер иначе не умеет. Просто то, что ты делаешь, вероятно, вовсе не то, что ты хочешь сделать. Логика в запросе косая - оттуда и ноль.
...
Рейтинг: 0 / 0
Переделать запрос
    #39152340
motoroller1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ситуация в следующием что 16200 - это образное число, а вообще это переменная, которая получается у меня тоже и JOIN
как я понимаю эту переменную я не могу вставить внутрь подзапроса
...
Рейтинг: 0 / 0
Переделать запрос
    #39152347
motoroller1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По сути вот верный полный запрос

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT `u`.`name`, `u`.`email`, `u2`.`name` AS `manager`, `psale`.`sale` AS `sale`, IFNULL(`ps`.`sum`, 0) AS `prevSum`

FROM  `users` AS `u`

LEFT JOIN `users` AS `u2` ON (`u2`.`id` = `u`.`manager`) 

LEFT JOIN (
	SELECT SUM(`sum`) AS `sum`, `dealer`
	FROM `sales` WHERE
	MONTH(`date`) = MONTH(DATE_ADD(NOW(), INTERVAL -1 MONTH)) AND YEAR(`date`) = YEAR(DATE_ADD(NOW(), INTERVAL -1 MONTH))
        GROUP BY `id`
) AS `ps` ON (`ps`.`dealer` = `u`.`id`)

LEFT JOIN (
     SELECT `sale`  FROM `reward` WHERE `sum` <= `ps`.`sum` ORDER BY `sum` DESC LIMIT 1
) AS `psale` ON (1= 1)					
					

WHERE `u`.`rights` = 33 GROUP BY `u`.`id`



И когда я вставляю `ps`.`sum` внутрь LEFT JOIN, то получаю ошибку: Unknown column 'ps.sum' in 'where clause', то мне улсовия обязательно надо вынести в ON
...
Рейтинг: 0 / 0
Переделать запрос
    #39152352
motoroller1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Логика как раз верная мне надо получить из второго JOIN`a сумму всех покупок, и потом на основе этой суммы из другой таблицы понять в какой диапазон попадает эта сумма, чтобы вывести скидки исходя из этой суммы
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Переделать запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]