Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 将左联接限制为1_Mysql_Sql_Left Join_Limit - Fatal编程技术网

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;