2010-07-19 125 views
1

在绕过此查询时有心理障碍。Mysql多对多查询

我有以下表格:

review_list:已大部分数据,但在这种情况下,唯一重要的是REVIEW_ID,该记录的ID,我目前(INT)感兴趣 variant_list:模型(VARCHAR),启用(布尔)
variant_review:模型(VARCHAR),身份证(INT)

variant_review是一个多对多表中review_list的REVIEW_ID链接到模型(一个或多个)在variant_l中IST审查和包含(例如):

.. 
test1,22 
test2,22 
test4,22 
test1,23 
test2,23... etc 

variant_list是所有可能的型号列表以及它们是否被启用,包含(例如):

test1,TRUE 
test2,TRUE 
test3,TRUE 
test4,TRUE 

什么我是在MySQL后是查询给定一个REVIEW_ID时(即,22)将返回一个结果,将列出在variant_review.model每个值,以及是否存在针对给定REVIEW_ID如:

test1,1 
test2,1 
test3,0 
test4,1 

或类似,这是我在f用一些复选框列出一些类型的网页。这将显示所有的型号以及是否每一个存在于表

+1

我无法理解你在找什么。它不会伤害到冗长。类似于每个表格的模式可能会帮助您找到解决方案。以及您想要的结果集的两个值是什么...... – FlyingStreudel 2010-07-19 15:34:25

+0

如果列举您的样本数据和样本输出中显示的列,这会很有帮助。 – Thomas 2010-07-19 15:35:08

+0

对不起,问题已经更新,以提供更清晰的问题和示例数据输入和输出 – Woody 2010-07-19 15:56:22

回答

2

鉴于对列名更多的信息:

Select variant_list.model 
    , Case When variant_review.model Is Not Null Then 1 Else 0 End As HasReview 
From variant_list 
    Left join variant_review 
     On variant_review.model = variant_list.model 
      And variant_review.review_id = 22 

只是为了保持完整性,如果是这样的话,你可以有在variant_review台相同型号和REVIEW_ID多行,那么你需要以不同的方式做到这一点:

Select variant_list.model 
    , Case 
     When Exists (
        Select 1 
        From variant_review As VR 
        Where VR.model = variant_list.model 
         And VR.review_id = 22 
        ) Then 1 
     Else 0 
     End 
From variant_list 
+0

谢谢你,但我认为我的问题是错误的。我已更新问题以清楚说明我正在努力实现的目标 – Woody 2010-07-19 15:57:26

+0

@Woody - 我修改了我的解决方案。这将从variant_list获得所有值,并且如果给定的review_id有值。我假设model和review_id的组合只能在variant_review表中出现一次(即,对于model和review_id,您不能有两行具有相同的值)。 – Thomas 2010-07-19 16:08:29

+0

第一个是好的,组合应该永远不会再出现。 非常感谢,救了我很多麻烦! – Woody 2010-07-19 21:37:17