Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Переделать запрос / 11 сообщений из 11, страница 1 из 1
21.01.2016, 03:17:06
    #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
21.01.2016, 03:18:58
    #39151899
motoroller1983
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переделать запрос
Описался вывожу Экспертов, но собственно они у меня с менеджерами в одной таблице и только отличаются кодами
...
Рейтинг: 0 / 0
21.01.2016, 09:07:15
    #39151959
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переделать запрос
motoroller1983если делать через Join как сделать чтобы не удваивалось?
Сперва подзапросами считать суммы, а только потом JOIN.
...
Рейтинг: 0 / 0
21.01.2016, 11:20:56
    #39152090
motoroller1983
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переделать запрос
Не совсем понятно, а можно примерчик))
...
Рейтинг: 0 / 0
21.01.2016, 11:27:45
    #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
21.01.2016, 12:38:08
    #39152183
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переделать запрос
motoroller1983а можно примерчик
Я понимаю, что пользоваться поиском - это моветон... но хотя бы список тем форума просмотреть что помешало?
Два JOINa и SUM() - помогите скорректировать запрос
...
Рейтинг: 0 / 0
21.01.2016, 14:00:10
    #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
21.01.2016, 15:08:43
    #39152334
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переделать запрос
motoroller1983есть кусок который все время неверно выполняется
Он выполняется верно - сервер иначе не умеет. Просто то, что ты делаешь, вероятно, вовсе не то, что ты хочешь сделать. Логика в запросе косая - оттуда и ноль.
...
Рейтинг: 0 / 0
21.01.2016, 15:15:14
    #39152340
motoroller1983
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переделать запрос
Ситуация в следующием что 16200 - это образное число, а вообще это переменная, которая получается у меня тоже и JOIN
как я понимаю эту переменную я не могу вставить внутрь подзапроса
...
Рейтинг: 0 / 0
21.01.2016, 15:20:28
    #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
21.01.2016, 15:23:16
    #39152352
motoroller1983
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переделать запрос
Логика как раз верная мне надо получить из второго JOIN`a сумму всех покупок, и потом на основе этой суммы из другой таблицы понять в какой диапазон попадает эта сумма, чтобы вывести скидки исходя из этой суммы
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Переделать запрос / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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