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

Код: sql
1.
2.
3.
4.
5.
6.
LEFT JOIN (
						SELECT IFNULL(SUM(`sum`), 0) `ss`, `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`)



Так вот когда я делаю вывод в основном запросе `ps`.`ss`
когда есть значение, то все ок, выдает число, а когда значения нет, он вместо 0 выдает NULL. Хотя во внутреннем JOIN я использую IFNULL
...
Рейтинг: 0 / 0
Странное поводение запроса
    #39152182
motoroller1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще вопросик: вот такая конструкия по-видимому не проходит

Код: sql
1.
2.
3.
LEFT JOIN (
						SELECT `sale` FROM `reward` ORDER BY `sum` DESC LIMIT 1
					) AS `psale` ON (`psale`.`sale` <= IFNULL(`ps`.`sum`, 0))



То есть не посылает 0, если я в основном запросе пытаюсь сделать что-то типа: IFNULL(`ps`.`sum`, 0) AS `prevSum`,

и

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

[/SRC]

То не проходит, подскажите как быть, мне обязателньо из внутренного JOIN надо получить 0 а не NULL если не найдено, и потом запустить эти данные в другие подзапросы
...
Рейтинг: 0 / 0
Странное поводение запроса
    #39152189
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motoroller1983когда значения нет
Тогда и записи в подзапросе нет. И внешний LEFT JOIN подставляет NULL.
...
Рейтинг: 0 / 0
Странное поводение запроса
    #39152191
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motoroller1983мне обязателньо из внутренного JOIN надо получить 0 а не NULL если не найдено
Сервер не умеет отдавать данные, которых у него НЕТ. Даже в подзапросах.
...
Рейтинг: 0 / 0
Странное поводение запроса
    #39152220
motoroller1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скажите, а как быть в данном случае, если дальше в подзапроса мне надо оперировать нулем?
...
Рейтинг: 0 / 0
Странное поводение запроса
    #39152272
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 <= 16200 ORDER BY `sum` DESC LIMIT 1) AS `prevBonus`,



Все считалось корректно, то есть выводил сумму скидки для этого значения

Таблица типа:

sum sale
5000 10%
7000 11%
10000 13%
15000 15%
20000 17%
30000 19%
43000 21%
57000 23%
75000 25%

То есть в моем примере при сумме заказа на 16200 prevBonus должен быть равен 15%
...
Рейтинг: 0 / 0
Странное поводение запроса
    #39152336
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motoroller1983То есть в моем примере при сумме заказа на 16200 prevBonus должен быть равен 15%Да ни хрена. ON применяется ПОСЛЕ SELECT. Тогда как отбор должен быть в запросе, а не после его выполнения. Убери условие во WHERE подзапроса.
...
Рейтинг: 0 / 0
Странное поводение запроса
    #39152356
motoroller1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Логика как раз верная мне надо получить из второго JOIN`a сумму всех покупок, и потом на основе этой суммы из другой таблицы понять в какой диапазон попадает эта сумма, чтобы вывести скидки исходя из этой суммы

Код: 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`



В итоге я конечно же получаю ошибку #1054 - Unknown column 'ps.sum' in 'where clause'
То есть мне надо как-то вынести условие в ON JOIN`a, а не во внутрь запроса
...
Рейтинг: 0 / 0
Странное поводение запроса
    #39152402
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motoroller1983Логика как раз верная
Верная логика и верная её реализация при корректных данных дают верный результат всегда. Неверный результат всегда итог неверной логики, неверной реализации или неверных данных - по отдельности или в любой комбинации.

motoroller1983мне надо получить из второго JOIN`a сумму всех покупок, и потом на основе этой суммы из другой таблицы понять в какой диапазон попадает эта сумма, чтобы вывести скидки исходя из этой суммы
Должны быть вложенные подзапросы, а не параллельные.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Странное поводение запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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