2009-07-20 65 views
1

我有一張滿載記錄和PHP的巨大表格我正在爲每個頁面分別創建一個頁面。在網頁上我想alphatbetically互連連桿它們,例如頁面「鄧恩將在側邊欄像這樣的鏈接:PHP MySQL按字母順序排列鏈接

  • 達倫
  • 戴夫
  • 末日
  • 鄧恩
  • Dupp
  • Duss
  • 杜特

始終與3個鏈接上下任意一邊字母表。所有的數據將被一次插入到表格中,我能想到的唯一方法就是通過在插入字母時將數字設置爲相對於其他數據的位置。

這似乎很複雜,我想知道是否有一個更容易或更好的解決方案?我已經看到這在很多網站上完成,所以希望我能找到一個:)任何幫助將不勝感激。

回答

5

擴大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個必需條目的表格。

+1

+1不錯,但我想有可能occure一些問題,如果 「名」 心不是獨特的 – Flo 2009-07-20 14:30:48

+0

弗洛 - 是的,這個SQL確實假設數據庫中只有唯一的條目。 hlpiii提供了一個使用名稱ID的解決方案,如果確實使用了重複條目,這將使其更加健壯。 – different 2009-07-20 14:54:10

4

你需要做兩個查詢:

  1. 得到3個記錄中preceed 鄧恩

    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

如果您的name字段是唯一索引,則前兩個答案可以正常工作。但是,如果你有多個'Dunn',那麼你必須編寫比這更多的SQL。

假設我們想要的'Dunn'是123的記錄。我想我們在請求頁面的時候已經知道這個,因爲一般來說,我們通過record_id搜索'Dunn'而不是名字(myscript。 php?id = 123,而不是myscript.php?name = Dunn)。然後,我們可以做到這一點,收集3個以上和以下3:

FROM table WHERE name < ='鄧恩和record_id <> 123 ORDER BY name ASC LIMIT 3

和。 ..

FROM table WHERE name> ='鄧恩和record_id <> 123 ORDER BY name ASC LIMIT 3