What is optimal MySQL statement to select rows from same table that have some ids but not others? -
we need select segments_id, em_id following table mytable have segments_id of 5 or 8 not 1 or 7. clearer after comments made below, result set includes rows of segments_id, em_id em_id has segments_id of 5 or 8 not 1 or 7.
+-------------+-------+ | segments_id | em_id | +-------------+-------+ | 1 | 8 | | 1 | 17 | | 5 | 2 | | 5 | 4 | | 5 | 5 | | 5 | 16 | | 5 | 17 | | 7 | 4 | | 7 | 5 | | 7 | 8 | | 7 | 16 | | 8 | 4 | | 8 | 6 | | 8 | 8 | | 8 | 18 | | 18 | 6 | | 18 | 99 | +-------------+-------+ the result should be:
+-------------+-------+ | segments_id | em_id | +-------------+-------+ | 5 | 2 | | 8 | 6 | | 8 | 16 | +-------------+-------+ we need avoid using in clause because can scale millions of rows.
i understand involve join on and/or subquery i'm not seeing it. saw post stackoverflow: selecting rows table have same value 1 field cannot see solution.
you can use left join eliminate em_id has segment_id 1 or 7:
select m.segments_id, m.em_id mytable m left join (select * mytable (segments_id=1 or segments_id=7)) n on m.em_id=n.em_id n.segments_id null group m.em_id; see sqlfiddle here.
if 5 , 8 want keep , rest should eliminated, can tweak 1 of where clauses this:
select m.segments_id, m.em_id mytable m left join (select * mytable not (segments_id=5 or segments_id=8)) n on m.em_id=n.em_id n.segments_id null group m.em_id; sqlfiddle second query here.
and if 5 , 8 want keep , 1 , 7 want eliminate, can use (however in case, answer given @lad2025 might better choice):
select m.segments_id, m.em_id mytable m left join (select * mytable (segments_id=1 or segments_id=7)) n on m.em_id=n.em_id (n.segments_id null , (m.segments_id=5 or m.segments_id=8)) group m.em_id; pls. check third sqlfiddle improved set here.
Comments
Post a Comment