合并来自同一桌子的两个SELECTS

时间:2012-06-19 16:18:06

标签: mysql

我有一个包含项目的表格:

  • id(int)
  • ordering(int)
  • content(string)

我的项目页面显示当前项目和下三个项目的预览。为了获取接下来的三个项目,我想使用干净的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

3 个答案:

答案 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