2016-03-21 57 views
1

我有一个MySQL表称为活动像下面MySQL的 - 内连接到同一个表的WHERE子句

ID integer 
Name text 
isBalanced boolean 
redirects tinyint 

我想实现一个SELECT查询,使我得到的所有行,其中isBalanced是false PLUS只有在isBalanced为真的行的定义数量。我得到这个结果后,我需要得到最低数量redirects的单个结果。

我知道有办法做到这一点,但我很难找出如何。这是我得到了什么,直到知道

SELECT campaigns.id, campaigns.name, campaigns.isBalanced, campaigns.redirects 
FROM campaigns AS c 
INNER JOIN campaigns_2 AS c2 
WHERE c.isBalanced = 0 

但是我不能够从C2组只选择其中的一些,然后重新组合所有的过滤器,以获得单一个具有最低数量的redirects

任何帮助将不胜感激。

+0

显示一些示例数据和预期的结果。您不清楚您需要什么。 –

+0

你的“定义”行数是多少?这些ID是否在表格中?一些标准?另外,不要用“我想要这些行,然后我想从这些行中获得这个行”来思考。 SQL是基于集合的,你需要教你自己思考这些术语,而不是按顺序处理术语。 –

+0

@TomH是和否,SQL也是一种顺序。例如。当您从子查询中进行选择时,您可以将其视为两个步骤的过程。像IN或EXISTS(甚至是WHERE本身)也可以看作是一个连续的步骤。 – maraca

回答

3

这听起来像你想union all,也许order bylimit

select c.* 
from campaigns c 
where c.isBalanced = 0 
union all 
(select c.* 
from campaigns c 
where c.isBalanced = 1 
limit ?? 
) 
order by redirects 
limit 1; 

的 “定义数字” 去哪里了??是。

+0

你不需要'UNION ALL',只需'UNION' – butterFlyNick

+0

@Stan。 。 。 'UNION ALL'永远比'UNION'更好,除非你特别想要去除重复值的开销。 –

+0

这就是@GordonLinoff。非常感谢你。 – wiredmark