Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Что изменила переменная ? / 7 сообщений из 7, страница 1 из 1
24.04.2017, 21:29
    #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
24.04.2017, 21:56
    #39443678
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что изменила переменная ?
NecrosssКак это вообще можно объяснить ?Ляхко! в документации явно написано, что порядок вычисления выражений с переменными не определён. А потому неизвестно, откуда взято значение @Percent при вычислении NewPrice - присвоено из PricePercent этой записи или осталось от вычислений для предыдущей.
...
Рейтинг: 0 / 0
24.04.2017, 22:02
    #39443685
Necrosss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что изменила переменная ?
Akina,

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

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

(Price + Price * Percent / 100) AS NewPrice


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

Что же тогда мне можно сделать чтобы починилось ? Или ничего нельзя сделать ?
...
Рейтинг: 0 / 0
24.04.2017, 22:29
    #39443694
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что изменила переменная ?
Поскольку в том виде, в каком оно тут показано, всё это действо бессмысленно до идиотизма, то, вероятно, это модель. Неудачная, прямо скажем. Думаю, лучше будет озвучить реальную задачу и реальную структуру исходных данных.
...
Рейтинг: 0 / 0
24.04.2017, 22:45
    #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
24.04.2017, 22:51
    #39443710
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что изменила переменная ?
И вот всего-то? и весь этот геморрой с переменными - просто из нежелания два раза написать одно и то же выражение? ну несерьёзно, право слово...
...
Рейтинг: 0 / 0
24.04.2017, 22:53
    #39443711
Necrosss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что изменила переменная ?
Akina,

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


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