Mysql 将左联接限制为1
我遇到了一个限制左连接的问题,我想要的是第一个表中的每一行只从第二个表中得到一个结果 以下是我的代码,没有限制:Mysql 将左联接限制为1,mysql,sql,left-join,limit,Mysql,Sql,Left Join,Limit,我遇到了一个限制左连接的问题,我想要的是第一个表中的每一行只从第二个表中得到一个结果 以下是我的代码,没有限制: SELECT * FROM ( ((SELECT id,date as end,machine_id,numer FROM `order_log` WHERE typ = 1)STOP left join (SELECT date as begin, machine_id, numer FROM `order_log` ST WHERE typ = 0 ORDER B
SELECT * FROM
(
((SELECT id,date as end,machine_id,numer FROM `order_log` WHERE typ = 1)STOP
left join
(SELECT date as begin, machine_id, numer FROM `order_log` ST WHERE typ = 0 ORDER BY date DESC)START
ON START.begin < STOP.end AND START.machine_id = STOP.machine_id
AND START.numer = STOP.numer)
)
预期结果:
id end machine_id numer begin machine_id numer
6 2015-05-26 16:16:19 39 31392 2015-05-26 15:44:56 39 31392
10 2015-06-02 00:40:07 24 31761 2015-05-26 16:14:03 24 31761
8 2015-05-28 08:15:26 39 31392 2015-05-26 16:16:19 39 31392
12 2015-06-02 13:11:13 39 31386 2015-05-28 08:15:26 39 31386
提前谢谢
编辑:
为了澄清,我的查询(第一个)正在工作,但它给出的结果比我想要的要多,所以我只需要将其限制为只从左联接的第二个表中获取一行。所以每一行从
(SELECT id,date as end,machine_id,numer FROM `order_log` WHERE typ = 1)
left join
(SELECT date as begin, machine_id, numer FROM `order_log` ST WHERE typ = 0 ORDER BY date DESC)START
ON START.begin = (SELECT date FROM `order_log` WHERE date < STOP.end AND typ = 0 AND machine_id = STOP.machine_id AND numer = STOP.numer ORDER BY date DESC LIMIT 1) AND START.machine_id = STOP.machine_id
AND START.numer = STOP.numer)
我只想从中得到一行
(SELECT id,date as end,machine_id,numer FROM `order_log` WHERE typ = 1)
left join
(SELECT date as begin, machine_id, numer FROM `order_log` ST WHERE typ = 0 ORDER BY date DESC)START
ON START.begin = (SELECT date FROM `order_log` WHERE date < STOP.end AND typ = 0 AND machine_id = STOP.machine_id AND numer = STOP.numer ORDER BY date DESC LIMIT 1) AND START.machine_id = STOP.machine_id
AND START.numer = STOP.numer)
第二行是不需要的首先,不要在MySQL中过度使用子查询。因此,将查询编写为:
SELECT s.id, s.date as end, s.machine_id, s.numer,
o.date as begin, o.machine_id, o.numer
FROM order_log s left join
order_log o
ON o.date < s.date AND o.machine_id = s.machine_id AND o.numer = s.numer
WHERE s.typ = 1 and o.typ = 0 ;
首先,不要在MySQL中过度使用子查询。因此,将查询编写为:
SELECT s.id, s.date as end, s.machine_id, s.numer,
o.date as begin, o.machine_id, o.numer
FROM order_log s left join
order_log o
ON o.date < s.date AND o.machine_id = s.machine_id AND o.numer = s.numer
WHERE s.typ = 1 and o.typ = 0 ;
你在哪里开始和结束的条件是什么?请澄清,有两种不同的情况。首先,只有1个匹配的行,因此联接应该简单地接受它=查询根本没有执行您希望它执行的操作。2.查询是正确的,但有多行,您只想将其限制为一行。。意思是你在查询中得到的任何一行都是可以的。你得到开始和结束的条件是什么?请澄清,有两种不同的情况。首先,只有1个匹配的行,因此联接应该简单地接受它=查询根本没有执行您希望它执行的操作。2.查询是正确的,但有多行,您只想将其限制为一行。。意思是你在查询中得到的任何一行都是可以的。你得到开始和结束的条件是什么?请澄清,有两种不同的情况。首先,只有1个匹配的行,因此联接应该简单地接受它=查询根本没有执行您希望它执行的操作。2.查询是正确的,但有多行,您只想将其限制为一行。。这意味着你在查询中得到的任何一行都是可以的。第一行是等价的,但与第二行相比,我遇到了一个问题。我想得到一对start和stop,其中typ='1'是stop,typ='0'是start,并且只有stop存在的结果。所以这张桌子应该有4个results@Alek . . . 如果您想要两行所在的行,那么添加
使end\u id不为null,start\u id不为null
。第一行是等效的,但与第二行相比,我遇到了一个问题。我想得到一对start和stop,其中typ='1'是stop,typ='0'是start,并且只有stop存在的结果。所以这张桌子应该有4个results@Alek . . . 如果您想要两行所在的行,那么添加使end\u id不为null,start\u id不为null
。第一行是等效的,但与第二行相比,我遇到了一个问题。我想得到一对start和stop,其中typ='1'是stop,typ='0'是start,并且只有stop存在的结果。所以这张桌子应该有4个results@Alek . . . 如果您想要两行所在的行,那么添加使end\u id不为null,start\u id不为null
。
select machine_id, numer,
max(case when ol.typ = 1 then id end) as end_id,
max(case when ol.typ = 1 then date end) as end_date,
max(case when ol.typ = 0 then id end) as start_id,
max(case when ol.typ = 0 then date end) as start_date
from (select ol.*,
(select count(*)
from order_log ol2
where ol2.machine_id = ol.machine_id AND ol2.numer = ol.numer
) as grp
from orderlog ol
) ol
where grp = 1
group by machine_id, numer;