Получение строки до и после запроса - PullRequest
0 голосов
/ 04 января 2010

У меня сейчас есть этот запрос

SELECT  short_url,
        type,
        file_thumbnail,
        file_embed,
        media.id,
        user,
        media.file_url,
        votes,
        comments,
        GROUP_CONCAT(info.itemTime) AS time,
        info.title,
        media.time AS oldTime,
        media.title,
        info.topic,
        GROUP_CONCAT(votes) AS totalVotes,
        GROUP_CONCAT(votes) AS listVotes, 
        GROUP_CONCAT(comments) AS listComments, 
        GROUP_CONCAT(url) AS listSites 
from    info JOIN 
        media on info.mid=media.id 
WHERE   media.id='$id' 
GROUP BY    mid 
ORDER BY    media.id DESC 
LIMIT 0,1

Я добавляю новую функцию, которая позволяет легко переходить к предыдущему или следующему элементу.Есть ли простой способ изменить вышеуказанный запрос, чтобы он вытягивал предыдущую строку, текущую строку и следующую строку?Или проще сделать еще один запрос?

Ответы [ 5 ]

4 голосов
/ 04 января 2010

Вы можете использовать подзапросы, чтобы получить идентификатор предыдущих и следующей записи:

...
where media.id in (
  '$id',
  (select max(id) from media where id < '$id'),
  (select min(id) from media where id > '$id')
)
...
1 голос
/ 04 января 2010

Вы действительно хотите следующую строку в базе данных? Ваши данные проиндексированы на info.id? Если нет, то ваш следующий ряд может оказаться не тем, что вы ожидаете. Что делать, если вам нужно изменить порядок вещей?

Вы можете рассмотреть возможность использования next_id и previous_id в качестве полей в информации, а затем

SELECT
    ...
FROM info current_info
INNER JOIN media current_media
    ON current_info.id = current_media.id

INNER JOIN info prev_info
    ON prev_info.id = current_info.previous_id 
INNER JOIN media prev_media
    ON prev_info.id = prev_media.id

INNER JOIN info next_info
    ON next_info.id = current_info.next_id 
INNER JOIN media next_media
    ON next_info.id = next_media.id

WHERE current_media.id = '$id'

Это дает преимущества всегда возвращать одну строку. Почему это хорошо? Если нет предыдущего или нет следующего, как определить, являются ли две возвращенные строки предыдущей и текущей или текущей и следующей.

Это также более управляемо, так как вы можете изменить порядок элементов, изменив их идентификаторы.

(ВНИМАНИЕ: приведенный выше код может не работать, у меня на ноутбуке нет клиента sql. Но, надеюсь, он укажет вам правильное направление)

1 голос
/ 04 января 2010

Вот пара ключевых моментов, которые должно поддерживать ваше приложение:

  • Не загружайте больше данных, чем необходимо. (Вы не знаете, будет ли пользователь использовать предыдущие / следующие строки или нет.)
  • Сделать URL-адреса вменяемыми, используя стабильные URL-адреса везде, где это возможно. (URL-адрес не должен указывать на то, что вы хотите быть 3 рядом со строкой # 127.)

Учитывая эти цели, я бы порекомендовал, чтобы при нажатии на ссылку "следующая строка" страница извлекала идентификатор следующей строки, а затем перенаправляла на постоянную ссылку для этой строки. Так, например:

http://example.com/media/1337/prev должно работать:

SELECT id FROM media WHERE media.id < 1337 ORDER BY media.id DESC LIMIT 1

И перенаправить, предположительно, http://example.com/media/1336.

http://example.com/media/1337/next должно работать:

SELECT id FROM media WHERE media.id > 1337 ORDER BY media.id ASC LIMIT 1

И перенаправить, предположительно, http://example.com/media/1338.

0 голосов
/ 04 января 2010

Вы можете использовать объединение, чтобы получить предыдущие и следующие строки:

SELECT
    ...
FROM info
INNER JOIN media
    ON info.mid = media.id
WHERE media.id < '$id'
GROUP BY mid
ORDER BY media.id DESC
UNION ALL
SELECT
    ...
FROM info
INNER JOIN media
    ON info.mid = media.id
WHERE media.id = '$id'
GROUP BY mid
ORDER BY media.id DESC
UNION ALL
SELECT
    ...
FROM info
INNER JOIN media
    ON info.mid = media.id
WHERE media.id > '$id'
GROUP BY mid
ORDER BY media.id ASC

Однако, если ваш пользователь будет хотеть видеть предыдущий или следующий элемент каждый раз, когда они перемещаются, то вы все равно будете нажимать на базу данных, чтобы получить следующий элемент в любом направлении, в котором они перемещаются.

Я бы порекомендовал перетаскивать страницу за раз и вместо этого перемещаться по ней во внешней части.

0 голосов
/ 04 января 2010

Вы можете попробовать перетащить несколько строк (т. Е. Страницу результатов) с начальным запросом, а затем перемещаться по этим данным во внешней части.Если вам нужны самые точные данные из базы данных, я не вижу другого выхода, кроме как сделать дополнительный запрос.

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