PHP MySQL Алфавитное связывание - PullRequest
1 голос
/ 20 июля 2009

У меня огромная таблица, полная записей, и с помощью PHP я делаю отдельную страницу для каждой из них. На странице, которую я хочу связать их альфатически, например, на странице «Незнайка» будут ссылки, подобные этой на боковой панели:

  • Даррен
  • Dave
  • Думы
  • Dunn
  • Dupp
  • DUSS
  • Датт

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

Это кажется сложным, и мне интересно, было ли более простое или просто лучшее решение? Я видел, как это было сделано на нескольких сайтах раньше, так что надеюсь, я смогу найти один :) Любая помощь будет оценена.

Ответы [ 3 ]

5 голосов
/ 20 июля 2009

Расширение ответа Gumbo: Вы можете сделать это одним запросом, если хотите, с помощью UNION.

(
SELECT  `name` 
FROM  `table` 
WHERE  `name` <  "Dunn"
ORDER BY  `name` DESC 
LIMIT 3
)
UNION ALL (

SELECT  `name` 
FROM  `table`
WHERE  `name` =  "Dunn"
LIMIT 1
)
UNION ALL (

SELECT  `name` 
FROM  `table` 
WHERE  `name` >  "Dunn"
ORDER BY  `name` ASC
LIMIT 3
)

Таким образом, дается таблица со всеми 7 обязательными записями.

4 голосов
/ 20 июля 2009

Вам нужно сделать два запроса:

  1. Получить 3 записи, которые предшествовали Dunn :

    SELECT `name`
    FROM `table`
    WHERE `name` < "Dunn"
    ORDER BY `name` DESC
    LIMIT 3
    
  2. Получите 3 записи, которые следуют Данн :

    SELECT `name`
    FROM `table`
    WHERE `name` > "Dunn"
    ORDER BY `name` ASC
    LIMIT 3
    
2 голосов
/ 20 июля 2009

Если ваше поле name является уникальным индексом, первые два ответа работают нормально. Но если у вас есть более одного «Dunn», например, вам придется написать немного больше SQL, чем это.

Скажем, «Dunn», который мы хотим, это запись 123. Я предполагаю, что мы уже знали это, когда запрашивалась страница, потому что, как правило, мы ищем «Dunn» по record_id, а не по имени (myscript.php ? id = 123, а не myscript.php? name = Dunn). Затем мы можем сделать это, чтобы собрать 3 сверху и 3 снизу:

SELECT <code>name ОТ table ГДЕ name <= 'Данн' И <code>record_id <> 123 ЗАКАЗАТЬ НА name ASC LIMIT 3

И ...

SELECT <code>name ОТ table ГДЕ name> = 'Незнайка' И record_id <> 123 ЗАКАЗАТЬ ПО name ASC LIMIT 3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...