如何在mysql中的单独表上完全匹配一个匹配?

时间:2012-02-03 01:25:03

标签: mysql join

我遇到了mysql的问题,你可以提供帮助。我有2个具有以下结构的表,以及几个示例行

TABLE 1
-------
LISTID     NAME        10_OTHER_COLUMNS
---------------------------------------
1          List1
2          List2
3          List3

TABLE 2
-------
LISTID      LISTTYPE(ENUM, 4 options)
------------------------------------------------
1           type1
1           type2
2           type3
3           type1
3           type2
3           type3

从表1到表2中的关系是一对多。我想在表1上执行选择,其中行仅返回,并且只有它们在表2上只有一个匹配。解释得更好,列表可能如果我只是做一个,有多种类型:

SELECT t1.*
FROM table_1 t1
LEFT JOIN table_2 t2 USING (listid)
WHERE t2.listtype = 'type3'

返回 List2 List3 。我想从结果中删除 List3 ,只有 List2 。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

好吧,我认为我明白了......你要求的是:“type3”,一个澄清的英文描述将是......

给我一​​个列表,列出所有表格(即:ListID),AT MOST只有我正在寻找的一个代码,没有别的,与任何其他“类型”无关。

select 
      t1.*
   from
      ( select
              t2.ListID,
              count(*) as TotalTypesForTable,
              sum( if( t2.type = 'type3', 1, 0 )) as TypeWanted
           from
              Table2 t2
           group by
              t2.ListID ) PreQuery

      JOIN Table1 t1
         on PreQuery.ListID = t1.ListID
   where
          PreQuery.TypeWanted = 1
      AND PreQuery.TotalTypesForTable = 1

反馈选项......

根据您对几百万条记录的评论,我会以这种方式进行调整,整体上也可能更快。

select 
      t1.*
   from
      Table2 t2Required

         LEFT JOIN Table2 as t2Extra
            on t2Required.ListID = t2Extra.ListID
           AND NOT t2Extra.type = 'type3'

         JOIN Table1 t1
            on t2Required.ListID = t1.ListID
   where
          t2Required.type = 'type3'
      and t2Extra.ListID IS NULL

我也想知道第二个的性能差异。第二种方法实际上是基于预期的“找不到我”的意图,但不需要子选择。通过将table2连接到自己的相同ID,但是我们正在寻找的“任何其他”类型,我们想要的唯一一个是我们在t2Extra实例中找不到的条目。然后,从t1获取表名...