我正在编写一个mysql筛选器查询,该查询具有一个主表和另一个表,该表针对主表的每个记录保存多个记录(我将其称为表子)。
我试图编写一个查询,该查询根据子表上的值获取主表的记录。如果子表条件为1,那么我将可以简单地通过加入来完成,但是我有2个条件属于同一字段。
For ex. table 1: id name url 1 XXX http://www.yahoo.com 2 YYY http://www.google.com 3 ZZZ http://www.bing.com table 2: id masterid optionvalue 1 1 2 2 1 7 3 2 7 4 2 2 5 3 2 6 3 6
当optionvalue第二个表上只有两个不同条件都匹配时,我的查询必须返回唯一的主记录。我用IN编写查询…
optionvalue
select * from table1 left join table2 on table1.id=table2.masterid where table2.optionvalue IN(2,7) group by table1.id;
这使我获得了所有3条记录,因为IN基本上是在检查“ OR”,但是在我的情况下,我不应该获得第3条主记录,因为它的值是2,6(没有7)。如果我用“ AND”写查询,则没有任何记录…
select * from table1 left join table2 on table1.id=table2.masterid where table2.optionvalue = 2 and table2.optionvalue = 7;
这将不会返回的记录,并且会因为无法检查同一列上的不同值而失败。我想编写一个查询,以获取具有子记录的主记录,该子记录的字段optionvalues将2和7都保存在不同的记录上。
optionvalues
任何帮助将非常感激。
确实,正如AsConfused所暗示的那样,您需要使用别名对TABLE2进行两次联接
- both of these are tested:
both of these are tested
-- find t1 where it has 2 and 7 in t2 select t1.* from table1 t1 join table2 ov2 on t1.id=ov2.masterid and ov2.optionValue=2 join table2 ov7 on t1.id=ov7.masterid and ov7.optionValue=7 -- find t1 where it has 2 and 7 in t2, and no others in t2 select t1.*, ovx.id from table1 t1 join table2 ov2 on t1.id=ov2.masterid and ov2.optionValue=2 join table2 ov7 on t1.id=ov7.masterid and ov7.optionValue=7 LEFT OUTER JOIN table2 ovx on t1.id=ovx.masterid and ovx.optionValue not in (2,7) WHERE ovx.id is null