Php 合并MySQL查询?
有没有一种方法可以组合这两个MySQL查询?目前这使得排序和分页等变得非常困难Php 合并MySQL查询?,php,mysql,Php,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' ORD
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;
选择*
FROM(`lb_sales`)
其中“重复性”=“0”
和“创建”>=“2012-10-01 00:00:00”
和'created`尝试UNION ALL
,只需确保列对齐即可。另外,不要使用选择*
。始终指定列列表
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;
选择col1、col2。。。
FROM(`lb_sales`)
其中“重复性”=“0”
和“创建”>=“2012-10-01 00:00:00”
然后“创建”SELECT*
FROM(`lb_sales`)
其中((`recurtive`='0'
和“创建”>=“2012-10-01 00:00:00”
和“创建”尝试:
SELECT*FROM(`lb_sales`)
其中(`Recurtive`='0'和`created`>='2012-10-01 00:00:00'
然后“创建”SELECT*
FROM(`lb_sales`)
其中(`recurtive`='0'
和“创建”>=“2012-10-01 00:00:00”
然后“创建”SELECT*
FROM(`lb_sales`)
哪里
(
`重复出现的“=“0”
和“创建”>=“2012-10-01 00:00:00”
和“创建”原始查询,每个查询最多返回5条记录(即总共最多10条),而此查询最多返回10个记录中的5个。很好的一点…我已将限制设置为10,但显然无法保证结果集将从Recurrence=0集生成5行,从Recurrence=1集生成5行。原始查询每个最多返回5条记录(即总共10条),而此查询最多返回10条记录中的5条。这是因为您必须更改结尾处的限制,但如果他希望返回与原始查询中相同的记录,则仅调整此limit
子句无法实现这一点。假设设置limit 10
,但recurtive=1
中还有5条记录至少是在recurtive=0
中的任何一个之前排序的。那么他不可能通过一个查询实现这一点,也许一个带有游标的sql脚本可以帮助一个联合
查询实现这一点。不一样,你的查询可以返回5行,他的原始查询可以返回10行。你是对的,但是你可以告诉我这是我们都没有解决的问题。我对原始问题提出了一个问题,看看我们是否可以获得更多信息。原始查询每个返回最多5条记录(即总共10条),而此查询最多返回10条记录中的5条。OP可以根据需要更改限制
。但是,如果他希望返回与原始查询中相同的记录,仅调整此限制
子句将无法实现此目的。假设设置了限制10
,但重复=1排序在recurtive=0
中的任何一个之前。正确,因此他需要计算出在组合查询中他想要得到多少行。但我的观点是,LIMIT
的值很可能不会返回与最初两个查询中相同的结果。许多注释都可以看出这一点wn以下,您的限制可能是一个问题。这两种类型的记录中有5个是很重要的,还是总共有5个工作,还是总共有10个工作?还有,您使用什么设置进行分页和排序?是服务器端还是客户端?是框架还是您自己编写的东西?这些都是很小的回报,可能会带来更多的回报然后,您的分页设置将重点放在合并这两个记录上。@FrankB:UNION
克服了限制
问题。感谢您的良好响应。我正在使用CodeIgniter进行分页和排序。它将返回最多10个结果。FrankMartin因此,如果我理解正确,将限制设置为10将对大多数ans产生影响下面的答案能满足你的需要吗?@eggyal你完全正确,因此我投了赞成票。但如果他只想在记录集中排名前10位,并且符合这两个标准,那么工会就没有必要了。
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;
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;
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;
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;