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 列に各 motionid の 0 または 1 が含まれる結果を生成したいと考えています。特定の MovementID が bb_run に追加されると、レコードが bb_runsheet テーブルに存在します (bb_run には、多くの bb_runsheet レコードが含まれる場合があり、プライマリには MovementID が含まれます)。

私が抱えている問題は、動きが実行中の場合 (つまり、基準と bb_runsheet テーブルのエントリに一致する bb_run レコードがある場合)、結果データセットに 2 つの行が表示されることです-例:

mvt_id active_on_pick
21     0
21     1

私が欲しいのは 21 と 1 だけです。サブクエリと他のバリエーション (motionid によるグループ化など) を試しましたが、うまくいくようです。私はmysqlを使用しています

4

2 に答える 2

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
于 2013-10-05T12:14:27.180 に答える