2009-07-20 13 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