0

我有一张桌子,里面有项目:

  • 标识(整数)
  • 排序(整数)
  • 内容(字符串)

我的项目页面显示当前项目和接下来三个项目的预览。为了获取接下来的三个项目,我想使用一个干净的 MySQL 查询。当然,如果此人在最后一个项目中,则没有剩下 3 个项目可以展示。

所以它需要再次显示第一个。

基本上我试图结合这两个陈述:

SELECT *
FROM projects
WHERE ordering > {currentProjectOrdering}
ORDER BY ordering ASC

SELECT *
FROM projects
WHERE ordering > 0
ORDER BY ordering ASC

并且

LIMIT 0,3

简而言之:获取比当前项目排序更高的接下来三个记录,如果(其中一些)不存在,则从 ordering = 1 开始。

假设有 10 个项目:项目 1 显示 2,3 和 4 项目 2 显示 3,4 和 5 ...项目 9 显示 10、1 和 2

4

3 回答 3

2

If you want data from first condition AND second condition use

SELECT *
FROM projects
WHERE ordering > {currentProjectOrdering} AND ordering > 0
ORDER BY ordering ASC
LIMIT 0,3

If you want data from first condition OR second condition use

SELECT *
FROM projects
WHERE ordering > {currentProjectOrdering} OR ordering > 0
ORDER BY ordering ASC
LIMIT 0,3
于 2012-06-19T16:31:52.837 回答
0

像这样的东西应该可以工作(假设你只限制那个人正在从事的项目):

     SELECT * FROM projects WHERE person = person_id && (ordering > 0 && COUNT(id) < 4) 
|| (ordering >= currentProjectOrdering && COUNT(id) >= 4)) ORDER BY ordering LIMIT 0,3;
于 2012-06-19T16:39:48.323 回答
0

我很好奇这个。我没有 mysql 也无法测试,但我认为您不会在这些示例中获得所需的 3 条记录 - 如果您位于列表的末尾并且需要从列表中获取 1 或 2开始。我正在玩TSQL- 所以没有LIMIT因此TOP

我也很好奇是否有人可以做得更好。

SELECT  TOP 3 
    CASE
    WHEN ORDERING >= {currentProjectOrdering} THEN ORDERING
    ELSE {currentProjectOrdering} - ORDERING END AS DISPLAYORDER,*
FROM SO_projects  
WHERE (ordering >= {currentProjectOrdering} AND ordering < {currentProjectOrdering}+ 3 ) OR ordering < 3
ORDER BY DISPLAYORDER DESC 

不能保证,因为我不知道 MYSQL,但这是我的尝试。在 T-SQLTOP中,根据 ORDER BY 返回指定数量的记录(在本例中为 3)。的 0,3 部分(我希望)中的 0 没有歧义LIMIT。我用谷歌搜索,看起来这些CASE东西应该非常相似。由于工作原理,您也许可以摆脱 > 和 < LIMIT。该逻辑适用于 SqlServer:

SELECT  
    CASE
    WHEN ORDERING >= {currentProjectOrdering} THEN ORDERING
    ELSE {currentProjectOrdering} - ORDERING END AS DISPLAYORDER,*
FROM SO_projects  
WHERE (ordering >= {currentProjectOrdering} AND ordering < {currentProjectOrdering} + 3    ) OR ordering < 3
ORDER BY DISPLAYORDER DESC 
LIMIT 0,3
于 2012-06-19T18:15:27.980 回答