2012-06-19 77 views
0

组合两个SELECTS我有一个项目的表在其中:来自同一个表

  • ID(INT)
  • 排序(INT)
  • 内容(串)

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

+2

为什么不只是把两个where语句结合起来? – bnvdarklord

+0

联盟是你想要的吗? – VanessaBR

+0

这么简单....将两个where子句结合在一个SELECT中...... –

回答

2

如果你想从数据第一个条件秒病症使用

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

如果你想从第一个条件秒病症使用的数据

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

感谢您清除此错误,遗憾的是,这不是我的意思: OR语句将获得我所有的结果,AND语句将获得所有结果与当前项目相比,“订购”的价值更高。我想要实现的是:获取接下来的三个记录,其排序比当前项目更高,如果(某些)这些不存在,则从order = 1开始。 – Michiel

0

这样的事情应该工作(假定您只是限制项目的那个人正在研究):

 SELECT * FROM projects WHERE person = person_id && (ordering > 0 && COUNT(id) < 4) 
|| (ordering >= currentProjectOrdering && COUNT(id) >= 4)) ORDER BY ordering LIMIT 0,3; 
+0

谢谢shawn,但我不认为这个声明会让我得到我期待的结果,你认为你能解释你向我询问? – Michiel

+0

耶基本上它依靠操作的顺序来获得你想要的。因此,在伪代码中,where语句是:if person == person_id then then ordered大于0并且少于4个项目,那么如果排序大于或等于currentProjectOrdering,那么选择其他记录,并且有4个或更多记录用户返回顶部4. –

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根据ORDER BY返回指定的recs数(在这种情况下为3)。 LIMIT的0,3部分(我希望)中没有0的含义。我GOOGLE了,它看起来像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 
+0

似乎是合法的,太糟糕了我不知道如何写这个fr mysql :-(感谢你的时间,虽然! – Michiel

+0

我编辑并试试给你。 – user1166147