Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Вывод предыдущего и следующего товара
Покинул форум
Сообщений всего: 338
Дата рег-ции: Сент. 2012 Откуда: Гродно, Беларусь
Помог: 0 раз(а)
В соответствии с ней товары сортируются по цене. Если она одинакова для каких-то товаров, то сортировка осуществляется уже по id товара
Пример:
USD | id
5 | 2
5 | 3
10 | 1
20 | 4
В карточке товара хочу переделать формирование ссылок на просмотр карточек предыдущего и следующего товара. И вот именно при сортировке товаров по цене возникла проблема.
Остановлюсь на поиске предыдущего товара:
WHERE /*используются те же условия, что и при выводе превью товаров*/ AND id <> ". $id ." /* id текущего товара*/ AND USD <= ". $ USD ." /* стоимость текущего товара*/
ORDER BY USD DESC, id DESC
LIMIT 1"
Открываем карточку первого товара (таблица сверху). По идее, предыдущего товара не может быть, но так как в запросе цена искомого товара <= текущего товара , то в выборку попадает товар (второй в таблице , id – 3).
Прошу помощи в данном вопросе.
Заранее выражаю благодарность за оказанное содействие
partos.k
Отправлено: 28 Января, 2016 - 20:23:06
Новичок
Покинул форум
Сообщений всего: 12
Дата рег-ции: Июль 2012
Помог: 0 раз(а)
alnik-75 пишет:
Прошу помощи в данном вопросе.
а что конкретно работает не так?
по логике все верное выдает второй товар так как id не равняется первому а цена равна второму.
если хочется что бы выводился предыдущий товар, то стоит может условие чуть поправить:
сделать только меньше цены,
Покинул форум
Сообщений всего: 338
Дата рег-ции: Сент. 2012 Откуда: Гродно, Беларусь
Помог: 0 раз(а)
в таблице я привел пример, в какой последовательности выводится товар. Соответственно, предыдущие и следующие товары должны выводиться в тоже последовательности.
нельзя применять, т.к. если открыл карточку второго товара в списке, не будет первого товара (его цена также ведь равна 5 ).
Проблема в том, что используя такой запрос , как у меня, при просмотре карточки первого товара из списка не должно быть предыдущего. Но он все равно попадает в выборку, так как соблюдается условие
WHERE /*используются те же условия, что и при выводе превью товаров*/ AND id <> ". $id /* id текущего товара*/." AND (USD < ". $USD /* стоимость текущего товара*/." OR (USD = ". $USD ." AND id < ". $id ."))
ORDER BY USD DESC, id DESC
LIMIT 1"
Условия:
- цена должны быть ниже, чем у текущего товара;
- цена может быть такой же, как у текущего товара, но id искомого товара должно быть меньше чем у текущего
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
SELECT 'prev' as type, _____ выборка предыдущего
UNION ALL
SELECT 'next' as type, _____ выборка следующего
----- PostgreSQL DBA
alnik-75
Отправлено: 29 Января, 2016 - 19:41:51
Посетитель
Покинул форум
Сообщений всего: 338
Дата рег-ции: Сент. 2012 Откуда: Гродно, Беларусь
Помог: 0 раз(а)
большое спасибо, работает!!
Если можно, расскажите пожалуйста как понимать данную запись - 'prev' as type?
Поля такого в БД нет. Несмотря на это, оно появляется в массиве)))
Я так понимаю, в запросе объявляются переменные type и им присваиваются значения "next" или 'prev'. Правильно понимаю?
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
as любое_имя - псевдоним для результирующего поля.
Запрос может выбирать поле таблицы, может результат какой-то функции или ещё чего вычисляемое. А можно селектить и просто тут же указанную константу. Обычно в этом не много смысла, но иногда, как тут, бывает полезно.
Отдельно обращу внимание на union all вместо union. Практически везде, где пишут union, хотят сказать union all, но это разные операторы. Различие в том, что union подразумевает distinct, за счёт чего дороже обходится.
----- PostgreSQL DBA
alnik-75
Отправлено: 29 Января, 2016 - 20:37:43
Посетитель
Покинул форум
Сообщений всего: 338
Дата рег-ции: Сент. 2012 Откуда: Гродно, Беларусь
Помог: 0 раз(а)
Мелкий пишет:
Отдельно обращу внимание на union all вместо union. Практически везде, где пишут union, хотят сказать union all, но это разные операторы. Различие в том, что union подразумевает distinct, за счёт чего дороже обходится.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.