2012-01-05 37 views
4

我正在创建一个MySQL查询,我想检索一个ID,但只有当我在查询中指定的所有行中找到它时才匹配它。MySql,内部连接查询,必须匹配多行

Table: view_layout_rows 

ID owner rows 
___________________ 
49 1  2 
50 1  2 




Table: view_layout_rows_columns 

ID row columns 
___________________ 
49 1  5 
49 2  4 
50 1  5 
50 2  5 



SELECT vlr.id 
FROM view_layout_rows vlr 
INNER JOIN view_layout_rows_columns vlrc 
ON vlr.id = vlrc.id 
WHERE vlr.rows = 2 
AND (vlr.owner = 0 OR vlr.owner = 1) 

,所有下列条件必须满足:

(vlrc.row = 1 AND vlrc.columns = 5) 
(vlrc.row = 2 AND vlrc.columns = 5) 

只有ID 50应返回。 49不应退还,因为它只满足最后两个条款中的第一个条款。

我该怎么办? (请注意,我以前问过这个问题,但我的要求不清楚。第二次尝试。) 在此先感谢您的任何建议。

回答

5

加入救援! :-)每个表的

SELECT vlc.* 
FROM view_layout_rows vlc 
INNER JOIN view_layout_rows_columns vlrc1 ON vlrc1.id = vlc.id 
INNER JOIN view_layout_rows_columns vlrc2 ON vlrc2.id = vlc.id 
WHERE vlrc1.row = 1 AND vlrc1.columns = 5 
    AND vlrc2.row = 2 AND vlrc2.columns = 5 

    /* imported from original query */ 
    AND vlr.rows = 2 
    AND (vlr.owner = 0 OR vlr.owner = 1); 
+0

感谢 - 这看起来不错。如果我有两个以上的行,例如5行,如果我用五个内部联接动态构造查询,这仍然可以工作吗? – Lemmy 2012-01-05 09:59:46

+0

试试看:-) – 2012-01-05 10:00:10

+0

@Lemmy:应该工作,是的。虽然,如果我是你,我会重新思考我的模式在这种情况下:-) – 2012-01-05 10:02:57

0

单一访问:

select r.* 
from view_layout_rows r 
join (select id, count(*) rec_count 
     from view_layout_rows_columns 
     where row in (1,2) and 
      columns = 5 
     group by id 
     having count(*) = 2) c 
on r.id = c.id 
where r.rows = 2 and 
     r.owner in (0,1) 
+0

如果列值不同,您如何表达?例如(vlrc.row = 1 AND vlrc.columns = 2) (vlrc.row = 2 AND vlrc.columns = 5) – Lemmy 2012-01-05 10:54:23

+0

相应地修改内联视图中的where子句 - 例如。 '(行= 1和列= 2)或(行= 2和列= 5)'。 – 2012-01-05 11:01:24

+0

这似乎是一个不错的解决方案 - 谢谢。 – Lemmy 2012-01-05 11:13:06