2012-12-03 172 views
0

有没有一种方法可以结合这两个MySQL查询?目前正在进行分类和分页等工作非常困难。结合MySQL查询?

SELECT * 
FROM (`lb_sales`) 
WHERE `recurring` = '0' 
AND `created` >= '2012-10-01 00:00:00' 
AND `created` <= '2012-10-30 23:59:59' 
AND `status` = 'pending' 
AND `type` = 'sale' 
AND `account_id` = '2' 
ORDER BY `id` ASC 
LIMIT 5; 

SELECT * 
FROM (`lb_sales`) 
WHERE `recurring` = '1' 
AND `created` <= '2012-10-30 23:59:59' 
AND `status` = 'pending' 
AND `type` = 'sale' 
AND `account_id` = '2' 
ORDER BY `id` ASC 
LIMIT 5; 
+0

从下面的很多评论可以看出,您的限制可能是一个问题。这两种类型的记录中有5种或总共5种工作,还是总计10种工作是重要的?另外你用什么设置分页和排序?它是服务器端还是客户端?它是一个框架还是你自己写的东西?由于这些收益很小,因此可能会付出更多努力来查看您的分页设置,然后专注于合并这两个记录。 –

+0

@FrankB:'UNION' [由@njk提议](http://stackoverflow.com/a/13686163)克服了“LIMIT”问题。 – eggyal

+0

感谢您的好评。我使用CodeIgniter进行分页和排序。它应该返回10个结果。 –

回答

0
SELECT * 
FROM (`lb_sales`) 
WHERE ((`recurring` = '0' 
AND `created` >= '2012-10-01 00:00:00' 
AND `created` <= '2012-10-30 23:59:59') 
OR (`recurring` = '1' 
AND `created` <= '2012-10-30 23:59:59')) 
AND `status` = 'pending' 
AND `type` = 'sale' 
AND `account_id` = '2' 
ORDER BY `id` ASC 
LIMIT 10; 
+1

原始查询每个返回最多5条记录(即最多10条记录),而该查询最多返回5条记录。 – eggyal

+2

好点...我将限制设置为10,但显然不能保证结果集将从循环= 0组产生5行,从循环= 1组产生5行。 –

1

尝试UNION ALL,只要确保列对齐。另外,请勿使用SELECT *。始终指定一个列列表。

SELECT col1, col2, ... 
FROM (`lb_sales`) 
WHERE `recurring` = '0' 
AND `created` >= '2012-10-01 00:00:00' 
AND `created` <= '2012-10-30 23:59:59' 
AND `status` = 'pending' 
AND `type` = 'sale' 
AND `account_id` = '2' 
ORDER BY `id` ASC 
LIMIT 5 
UNION ALL 
SELECT col1, col2, ... 
FROM (`lb_sales`) 
WHERE `recurring` = '1' 
AND `created` <= '2012-10-30 23:59:59' 
AND `status` = 'pending' 
AND `type` = 'sale' 
AND `account_id` = '2' 
ORDER BY `id` ASC 
LIMIT 5; 
0

尝试:

SELECT * FROM (`lb_sales`) 
WHERE (`recurring` = '0' AND `created` >= '2012-10-01 00:00:00' 
AND `created` <= '2012-10-30 23:59:59') 
OR (`recurring` = '1' AND `created` <= '2012-10-30 23:59:59')  
AND `status` = 'pending' 
AND `type` = 'sale' 
AND `account_id` = '2' 
ORDER BY `id` ASC 
LIMIT 5; 
+0

原始查询每个返回最多5条记录(即总计最多10条记录),而此查询最多返回5条记录。 – eggyal

+0

OP可根据需要更改“限制”。 –

+1

但是,如果他想返回与原始查询中相同的记录,则只需调整此“LIMIT”子句即可。假设一个人设置了“LIMIT 10”,但是来自'recurring = 1'的记录还有5个来自'recurring = 0'中的任何记录。 – eggyal

0
SELECT * 
FROM (`lb_sales`) 
WHERE (`recurring` = '0' 
AND `created` >= '2012-10-01 00:00:00' 
AND `created` <= '2012-10-30 23:59:59' 
AND `status` = 'pending' 
AND `type` = 'sale' 
AND `account_id` = '2') 
OR (`recurring` = '1' 
AND `created` <= '2012-10-30 23:59:59' 
AND `status` = 'pending' 
AND `type` = 'sale' 
AND `account_id` = '2') 
ORDER BY `id` ASC 
LIMIT 5; 

也许是这样,但不是舒尔如果语法是正确的

+0

原始查询每个返回最多5条记录(即总计最多10条记录),而此查询最多返回5条记录。 – eggyal

+0

因为您必须在末尾更改限制 –

+0

但是,如果他要返回与其原始查询中的记录相同,只是调整此“LIMIT”条款不会达到此目的。假设一个人设置了“LIMIT 10”,但是来自'recurring = 1'的记录还有5个来自'recurring = 0'中的任何记录。 – eggyal

1
SELECT * 
FROM (`lb_sales`) 
WHERE 
(
`recurring` = '0' 
AND `created` >= '2012-10-01 00:00:00' 
AND `created` <= '2012-10-30 23:59:59' 
) 
OR 
( 
`recurring` = '1' 
AND `created` <= '2012-10-30 23:59:59' 
) 
AND `status` = 'pending' 
AND `type` = 'sale' 
AND `account_id` = '2' 
ORDER BY `id` ASC 
LIMIT 5; 

括号是你的朋友年轻padwan。当然,我假设你想要符合任何标准的记录。

+3

不一样,你的查询可以返回5行,他原来的查询可能返回10行。 –

+0

你是对的,但正如你可以说这是我们都没有解决的问题。我对原始问题提出了一个问题,看看我们是否可以获得关于它的更多信息。 –