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
Форумы портала PHP.SU :: Версия для печати :: Как упростить запрос
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Как упростить запрос

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

1. dzheka3d - 15 Июля, 2014 - 23:23:03 - перейти к сообщению
Приветствую всех! Есть у меня запрос, суть такова, что он должен вывести мне текущую запись плюс предыдущую и следующую. Все работает, но глядя на код, даже меня, далеко не профи, передергивает. Может подскажете как можно его преобразовать в более правильный и аккуратный?

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. (
  3. SELECT *
  4. FROM  `news` news
  5. INNER JOIN  `category` cat ON cat.`id` = news.`category_id`
  6. WHERE news.`id` <12
  7. ORDER BY news.`id` DESC
  8. LIMIT 1
  9. )
  10. UNION (
  11.  
  12. SELECT *
  13. FROM  `news` news
  14. INNER JOIN  `category` cat ON cat.`id` = news.`category_id`
  15. WHERE news.`id` =12
  16. LIMIT 1
  17. )
  18. UNION (
  19. SELECT *
  20. FROM  `news` news
  21. INNER JOIN  `category` cat ON cat.`id` = news.`category_id`
  22. WHERE news.`id` >12
  23. LIMIT 1
  24. )
2. OrmaJever - 15 Июля, 2014 - 23:41:04 - перейти к сообщению
если чисто теоретически предположить что news.id автоинкремент и новости не удаляются, то можно просто написать так
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT *
  2. FROM  news
  3. INNER JOIN  category cat ON cat.id = news.category_id
  4. WHERE news.id IN (12-1, 12, 12+1)
  5. ORDER BY news.id DESC
  6. LIMIT 3
3. dzheka3d - 16 Июля, 2014 - 00:29:29 - перейти к сообщению
автоинкремент, но новости удаляются... такой вариант не пройдет
4. Sail - 16 Июля, 2014 - 08:59:15 - перейти к сообщению
dzheka3d пишет:
автоинкремент, но новости удаляются...

Тогда нечто подобное:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM `table`
  2. WHERE `id` BETWEEN
  3.  (SELECT max(`id`) FROM `table` WHERE `id` < 114) AND
  4.  (SELECT min(`id`) FROM `table` WHERE `id` > 114)
  5. ;
  6.  


PS: А вот это вот:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT *
  2. FROM  `news` news
  3. INNER JOIN  `category` cat ON cat.`id` = news.`category_id`
  4. WHERE news.`id` >12
  5. LIMIT 1

В общем случае, вовсе не обязательно вернёт именно следующую (13-ю) новость...
Может и 14-ю, и 15-ю.... и 225-ю Улыбка
5. dzheka3d - 16 Июля, 2014 - 18:47:27 - перейти к сообщению
В принципе все, все, что нужно, спасибо. Но у себя решил выполнить в 3 запроса, т.к. не известно есть ли предыдущая или следующая запись в таблице исходя из этого нужно выводить или не выводить кнопку на перелистывание к следующей или предыдущей

 

Powered by ExBB FM 1.0 RC1