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 :: Вывод предыдущего и следующего товара

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
alnik-75
Отправлено: 28 Января, 2016 - 19:39:29
Post Id



Посетитель


Покинул форум
Сообщений всего: 338
Дата рег-ции: Сент. 2012  
Откуда: Гродно, Беларусь


Помог: 0 раз(а)




В соответствии с ней товары сортируются по цене. Если она одинакова для каких-то товаров, то сортировка осуществляется уже по id товара
Пример:
USD | id
5 | 2
5 | 3
10 | 1
20 | 4

В карточке товара хочу переделать формирование ссылок на просмотр карточек предыдущего и следующего товара. И вот именно при сортировке товаров по цене возникла проблема.
Остановлюсь на поиске предыдущего товара:
CODE (SQL):
скопировать код в буфер обмена
  1. "SELECT id, USD, date
  2. FROM declarations
  3. WHERE /*используются те же условия, что и при выводе превью товаров*/ AND id <> " . $id . " /* id текущего товара*/ AND USD <= " . $ USD . " /* стоимость текущего товара*/
  4. ORDER BY USD DESC, id DESC
  5. LIMIT 1"

Открываем карточку первого товара (таблица сверху). По идее, предыдущего товара не может быть, но так как в запросе цена искомого товара <= текущего товара , то в выборку попадает товар (второй в таблице , id – 3).
Прошу помощи в данном вопросе.
Заранее выражаю благодарность за оказанное содействие
 
 Top
partos.k
Отправлено: 28 Января, 2016 - 20:23:06
Post Id


Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




alnik-75 пишет:
Прошу помощи в данном вопросе.

а что конкретно работает не так?
по логике все верное выдает второй товар так как id не равняется первому а цена равна второму.

если хочется что бы выводился предыдущий товар, то стоит может условие чуть поправить:
сделать только меньше цены,

а вот следующую выборку товара который следующий:

(Отредактировано автором: 28 Января, 2016 - 20:29:10)

 
 Top
alnik-75
Отправлено: 28 Января, 2016 - 20:52:47
Post Id



Посетитель


Покинул форум
Сообщений всего: 338
Дата рег-ции: Сент. 2012  
Откуда: Гродно, Беларусь


Помог: 0 раз(а)




в таблице я привел пример, в какой последовательности выводится товар. Соответственно, предыдущие и следующие товары должны выводиться в тоже последовательности.

нельзя применять, т.к. если открыл карточку второго товара в списке, не будет первого товара (его цена также ведь равна 5 ).

Проблема в том, что используя такой запрос , как у меня, при просмотре карточки первого товара из списка не должно быть предыдущего. Но он все равно попадает в выборку, так как соблюдается условие
CODE (SQL):
скопировать код в буфер обмена
  1.  AND USD <= " . $ USD . "

(Добавление)
все, победил
 
 Top
partos.k
Отправлено: 28 Января, 2016 - 21:14:12
Post Id


Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




alnik-75 пишет:
все, победил

хотелось бы узнать как.
 
 Top
alnik-75
Отправлено: 28 Января, 2016 - 21:32:30
Post Id



Посетитель


Покинул форум
Сообщений всего: 338
Дата рег-ции: Сент. 2012  
Откуда: Гродно, Беларусь


Помог: 0 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1.  
  2.  
  3. "SELECT id, USD, date
  4. FROM declarations
  5. WHERE /*используются те же условия, что и при выводе превью товаров*/ AND id <> " . $id /* id текущего товара*/ . " AND (USD < " . $USD /* стоимость текущего товара*/. " OR (USD = " . $USD . " AND id < " . $id . "))
  6. ORDER BY USD DESC, id DESC
  7. LIMIT 1"
  8.  


Условия:
- цена должны быть ниже, чем у текущего товара;
- цена может быть такой же, как у текущего товара, но id искомого товара должно быть меньше чем у текущего

(Отредактировано автором: 28 Января, 2016 - 21:33:29)

 
 Top
alnik-75
Отправлено: 29 Января, 2016 - 19:13:04
Post Id



Посетитель


Покинул форум
Сообщений всего: 338
Дата рег-ции: Сент. 2012  
Откуда: Гродно, Беларусь


Помог: 0 раз(а)




Новая неурядица.

Поиск предыдущего и следующего товара осуществляю одним запросм , используя
SELECT_____ выборка предыдущего
UNION
SELECT_____ выборка следующего

Хорошо, когда были найдены и тот и другой. Получай массив, где первый элемент с данными о предыдущем товаре, а второй - следующего.

А что делать, если найдены лишь предыдущий либо лишь следующий. В массиве один элемент. Как узнать, предыдущий это товар или следующий?

Может кто то делал подобное?
Или нужно все же делать два запроса (для предыдущего и для следующего)?

(Отредактировано автором: 29 Января, 2016 - 19:13:39)

 
 Top
Мелкий Супермодератор
Отправлено: 29 Января, 2016 - 19:35:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




SELECT 'prev' as type, _____ выборка предыдущего
UNION ALL
SELECT 'next' as type, _____ выборка следующего


-----
PostgreSQL DBA
 
 Top
alnik-75
Отправлено: 29 Января, 2016 - 19:41:51
Post Id



Посетитель


Покинул форум
Сообщений всего: 338
Дата рег-ции: Сент. 2012  
Откуда: Гродно, Беларусь


Помог: 0 раз(а)




большое спасибо, работает!!
Если можно, расскажите пожалуйста как понимать данную запись - 'prev' as type?

Поля такого в БД нет. Несмотря на это, оно появляется в массиве)))
Я так понимаю, в запросе объявляются переменные type и им присваиваются значения "next" или 'prev'. Правильно понимаю?

(Отредактировано автором: 29 Января, 2016 - 20:00:19)

 
 Top
Мелкий Супермодератор
Отправлено: 29 Января, 2016 - 20:35:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




as любое_имя - псевдоним для результирующего поля.
Запрос может выбирать поле таблицы, может результат какой-то функции или ещё чего вычисляемое. А можно селектить и просто тут же указанную константу. Обычно в этом не много смысла, но иногда, как тут, бывает полезно.

Отдельно обращу внимание на union all вместо union. Практически везде, где пишут union, хотят сказать union all, но это разные операторы. Различие в том, что union подразумевает distinct, за счёт чего дороже обходится.


-----
PostgreSQL DBA
 
 Top
alnik-75
Отправлено: 29 Января, 2016 - 20:37:43
Post Id



Посетитель


Покинул форум
Сообщений всего: 338
Дата рег-ции: Сент. 2012  
Откуда: Гродно, Беларусь


Помог: 0 раз(а)




Мелкий пишет:

Отдельно обращу внимание на union all вместо union. Практически везде, где пишут union, хотят сказать union all, но это разные операторы. Различие в том, что union подразумевает distinct, за счёт чего дороже обходится.

Спасибо, уже обратил внимание.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB