2010-01-04 60 views
0

後,我現在有這個疑問獲取前行,並查詢

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 

我加入了新的功能,讓您輕鬆導航到上一個或下一個項目。有沒有簡單的方法來修改上面的查詢,以便它拉出前一行,當前行和下一行?或者只是做另一個查詢會更容易?

+1

要麼取消該限制,或增加行數會返回 – 2010-01-04 19:40:48

回答

4

您可以使用子查詢來獲取previos和下一條記錄的ID:

... 
where media.id in (
    '$id', 
    (select max(id) from media where id < '$id'), 
    (select min(id) from media where id > '$id') 
) 
... 
0

你可以嘗試拉多行(即結果的頁面)與初始查詢,然後通過在前端數據進行導航。如果您需要從數據庫獲得即時準確的數據,除了執行其他查詢之外,我沒有看到任何其他方法。

0

你可以使用一個聯盟來獲得一個和下一個行:

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 

但是,如果你的用戶會希望看到前一個項目或下一個項目每次瀏覽時間,那麼你還是會擊中數據庫以獲取他們正在導航的任何方向的下一個項目。

我會建議在同一時間拉頁,並通過它在前端導航來代替。

1

這裏有幾個關鍵點您的應用程序應該儘量保持:

  • 不要加載更多數據超過必要。(你不知道,如果用戶將使用上/下一個行或不行。)
  • 讓網址理智,使用的穩定網址,只要有可能。(網址不應表明您想成爲下一個3從列#127)

牢記這些目標,我建議在點擊「下一行」鏈接,頁面拉下一行的ID,然後重定向到該行的永久鏈接。因此,舉例來說:

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

1

你真的想在數據庫中的下一行?你在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' 

這樣做的總是返回一個單列的優勢。爲什麼這很好?如果沒有以前或沒有下一個,你如何判斷你的兩個返回的行是先前的還是當前的,還是當前的和下一個。

它也更易於管理,因爲您可以通過更改其兄弟ID來重新排序項目。

(警告:上面的代碼可能無法正常工作,我有我的筆記本電腦沒有SQL客戶端,但希望這將指向你在一個很好的方向。)