我有一个包含项目的表格:
我的项目页面显示当前项目和下三个项目的预览。为了获取接下来的三个项目,我想使用干净的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
简而言之:获得接下来的三个记录,其顺序高于当前项目,如果(某些)这些记录不存在,则从排序= 1开始。
假设有10个项目: 项目1显示2,3和4 项目2显示3,4和5 ... 项目9显示10,1和2
答案 0 :(得分:2)
如果您想要第一个条件的数据 AND 第二个条件,请使用
SELECT *
FROM projects
WHERE ordering > {currentProjectOrdering} AND ordering > 0
ORDER BY ordering ASC
LIMIT 0,3
如果您想要第一个条件的数据 OR 第二个条件,请使用
SELECT *
FROM projects
WHERE ordering > {currentProjectOrdering} OR ordering > 0
ORDER BY ordering ASC
LIMIT 0,3
答案 1 :(得分:0)
像这样的东西应该有用(假设你只限制那个人在做的项目):
SELECT * FROM projects WHERE person = person_id && (ordering > 0 && COUNT(id) < 4)
|| (ordering >= currentProjectOrdering && COUNT(id) >= 4)) ORDER BY ordering LIMIT 0,3;
答案 2 :(得分: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-SQL TOP
中,返回指定数量的rec(在本例中为3),具体取决于ORDER BY。 LIMIT
的0,3部分(我希望)中的0没有模棱两可。我用谷歌搜索,看起来CASE
的东西应该非常相似。你也许可以摆脱&gt;和&lt;因为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