powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Что изменила переменная ?
7 сообщений из 7, страница 1 из 1
Что изменила переменная ?
    #39443667
Necrosss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Есть вот такой запрос (в оригинале он выглядит гораздо сложее, для удобства привожу его упрощённую форму) :

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT

ID,
Name,
PricePercent,

(Price + Price * PricePercent / 100) AS NewPrice

FROM products

ORDER BY NewPricePSM=0,NewPricePSM

LIMIT 0,60


То есть. Имеется таблица "Товары" (products). Из неё вытаскиваем ИД, Название и "Новую цену" (NewPrice).
Новая цена - это старая цена (колонка Price) с приминением скидки (колонка PricePercent, может быть "-5", "-10" % и т.д) и всё это прямо в запросе.

Важный момент здесь - это ORDER BY. То есть товары отображаются согласно их цене (новой цене) в порядке возрастания (от самых дешёвых к самым дорогим). При этом "NewPricePSM=0" означается что товары, чья цена - 0 будут отброшены в самый конец списка.

В общем это запрос работате нормально. Претензий нет. Выводится список, где на первом месте товар с ценой 10 рублей, дальше 35, потом 100, потом 120 и т.д.

Но ! Мне понадобилось использовать переменную:
@Percent := PricePercent

Полный запрос выглядит вот так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT

ID,
Name,
@Percent := PricePercent,

(Price + Price * @Percent / 100) AS NewPrice

FROM products

ORDER BY NewPrice=0,NewPrice

LIMIT 0,60


Казалось бы, ничего не должно измениться... Но фиг там. ВНЕЗАПНО на первое место в списке попал товар с ценой 1890 рублей, а уже потом пошли 10, 35, 100 и т.д

Как это вообще можно объяснить ? У меня ни малейшей идеи...
...
Рейтинг: 0 / 0
Что изменила переменная ?
    #39443678
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NecrosssКак это вообще можно объяснить ?Ляхко! в документации явно написано, что порядок вычисления выражений с переменными не определён. А потому неизвестно, откуда взято значение @Percent при вычислении NewPrice - присвоено из PricePercent этой записи или осталось от вычислений для предыдущей.
...
Рейтинг: 0 / 0
Что изменила переменная ?
    #39443685
Necrosss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Изначально я попытался сделать:

Код: sql
1.
2.
3.
PricePercent AS Percent,

(Price + Price * Percent / 100) AS NewPrice


Но такой вариант выдал ошибку. Он не нашел "Percent" Поэтому и пришлоль прибегнуть к переменной.

Что же тогда мне можно сделать чтобы починилось ? Или ничего нельзя сделать ?
...
Рейтинг: 0 / 0
Что изменила переменная ?
    #39443694
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку в том виде, в каком оно тут показано, всё это действо бессмысленно до идиотизма, то, вероятно, это модель. Неудачная, прямо скажем. Думаю, лучше будет озвучить реальную задачу и реальную структуру исходных данных.
...
Рейтинг: 0 / 0
Что изменила переменная ?
    #39443702
Necrosss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Выложу оригинальный запрос (Если ты что-то разберёшь ;) )

Код: 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.
33.
34.
35.
36.
37.
38.
SELECT

pr.ID,
pr.Name,
pr.NameTranslit,

@oldPrice := IF(col.ParamEnable LIKE '%price%', col.Price, pr.Price),

@oldPrice AS OldPrice,
pr.Logo,
IF(col.ParamEnable LIKE '%areapp%', col.AreaPP, pr.AreaPP) AS AreaPP,

@pricePercent := IF(pr.PricePercent = 0, col.PricePercent, pr.PricePercent),

@pricePercent AS PricePercent,
(@oldPrice + @oldPrice * @pricePercent / 100) AS NewPrice,

pcol.Name AS CollectionName,
pcol.BreadcrumbsTranslit,

psup.Name AS SupplierName

FROM products AS pr

JOIN `pages` AS pcol
	ON `pcol`.`ID` = `pr`.`CollectionID`
	
	JOIN `pages` AS psup
	ON `psup`.`ID` = `pcol`.`ParentID`
	
	JOIN `collections` AS col
	ON `col`.`PageID` = `pr`.`CollectionID`
	
WHERE pcol.BreadcrumbsTranslit LIKE '$address%'
	
ORDER BY NewPrice=0,NewPrice

LIMIT 0,60"


Этот запрос работает, но как я уже говорил, "ВНЕЗАПНО на первое место в списке попал товар с ценой 1890 рублей, а уже потом пошли 10, 35, 100 и т.д".
...
Рейтинг: 0 / 0
Что изменила переменная ?
    #39443710
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вот всего-то? и весь этот геморрой с переменными - просто из нежелания два раза написать одно и то же выражение? ну несерьёзно, право слово...
...
Рейтинг: 0 / 0
Что изменила переменная ?
    #39443711
Necrosss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Весь этот геморроой из за того что я думал что его можно сократить и я прсто не шарю как.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Что изменила переменная ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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