2013-10-05 29 views
0

我有以下查询上的多个删除重复的行连接

select m.movementid, m.orderid, m.pickupdate, m.pickupnotes, 
b.bin_size, b.bin_type, 
l.address, l.suburb, l.postcode, l.state, 
if(rs.run_action = 'Pick', if (r.run_state = 'Active' or r.run_state='Ready', 1, 0), 0) as active_on_pick 
from bb_movement m 
inner join bb_bins b on b.bin_id = m.bin_id 
inner join bb_location l on l.locationid = m.locationid 
inner join bb_runsheet rs on rs.movement_id = m.movementid 
inner join bb_run r on r.run_id = rs.run_id 
where m.mvtstate = 'Active' 
order by m.locationid, m.pickupdate 

我希望产生其中active_on_pick列包含一个0或1的每个movementid的结果。 A记录在bb_runsheet表时存在一个给定的movementid添加到bb_run (一bb_run可以有很多bb_runsheet记录,这主要包含movementid)

我的问题是,当一个运动是一个运行(即:具有符合条件并在bb_runsheet表中的条目)我得到2行的结果数据集中bb_run记录 - 例如:

mvt_id active_on_pick 
21  0 
21  1 

我要的是21和1我试图子查询和其他变体(比如运动小组),但似乎可以钉住它。我用mysql

回答

1

如果你移动你的一些逻辑到您的加入(改为LEFT JOIN),就可以得到答案,感动更多的我觉得逻辑到另一个左连接

select m.movementid, m.orderid, m.pickupdate, m.pickupnotes, 
b.bin_size, b.bin_type, 
l.address, l.suburb, l.postcode, l.state, 

IF(r.run_id IS NULL, 0, 1) as active_on_pick 

from bb_movement m 
inner join bb_bins b on b.bin_id = m.bin_id 
inner join bb_location l on l.locationid = m.locationid 

LEFT join bb_runsheet rs 
ON rs.movement_id = m.movementid 
    AND rs.run_action = 'Pick' 

LEFT join bb_run r 
    ON r.run_id = rs.run_id 
    AND (r.run_state = 'Active' or r.run_state='Ready') 

where m.mvtstate = 'Active' 
order by m.locationid, m.pickupdate 
+0

@Ag,我试图为的就是运行这个查询,并得到1241错误(运行MySQL 5.5.29)。从最后一个删除1,0)并删除错误,但不能解决问题。我不习惯这种语法,但喜欢你采取的方法..我会继续黑客... – 300baud

+0

对不起 - 它有一个巨大的错字 – AgRizzo

+0

如果可以的话,把一些示例数据在sqlfiddle。 COM。这将使测试更容易 – AgRizzo

0

您可以使用ROW_NUMBER()

SELECT * FROM ( 
select row_number() over (order by active_on_pick desc) rn, 
m.movementid, m.orderid, m.pickupdate, m.pickupnotes, 
b.bin_size, b.bin_type, 
l.address, l.suburb, l.postcode, l.state, 
if(rs.run_action = 'Pick', if (r.run_state = 'Active' or r.run_state='Ready', 1, 0), 0) 
as active_on_pick 
from bb_movement m 
inner join bb_bins b on b.bin_id = m.bin_id 
inner join bb_location l on l.locationid = m.locationid 
inner join bb_runsheet rs on rs.movement_id = m.movementid 
inner join bb_run r on r.run_id = rs.run_id 
where m.mvtstate = 'Active' 
order by m.locationid, m.pickupdate 
) SampleTable 
Where rn = 1 
+0

ROW_NUMBER是MSSQL,MySQL的不感谢 – AgRizzo