2012-02-03 31 views
0

我有一個問題,你可能會提供幫助。我有2代表具有以下結構,和幾個示例行的如何與mysql中的單獨表上的一個匹配進行連接?

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' 

它返回列表2項目list3。我想從結果中刪除列表3,並且只有列表2。有任何想法嗎?

+0

那麼,你只需要第一個實例?基於找到的最低「ListID」值的給定「ListType」的類型? – DRapp 2012-02-03 01:53:09

+0

不,我想要只有一種類型的表格。一個表可能有多種類型,但我想要所有隻有一種類型的表。因此,如果我將type3傳遞給查詢,我希望類型3 **和**的表格不屬於類型1,2和4. – 2012-02-03 01:58:26

+1

不會特別高效,但可以添加AND GROUP_CONCAT(t2。 listtype)='type3'GROUP BY t1.listid'。 – 2012-02-03 03:11:31

回答

1

好吧,我想我明白了...你所要求的例如:「TYPE3」,英文說明,以澄清會...

給我的所有表的列表(即:ListID)在大多數人只有一個代碼,我正在尋找,沒有別的,沒有任何其他「類型」相關聯。

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 

我想也知道在第二個表現差異。第二種方法實際上基於INTENTIONAL期望的「不找我」,但不需要子選擇。通過在同一個ID上加入table2到它自己,但是除了我們正在尋找的「任何其他」類型,我們想要的唯一一個是我們在t2Extra實例中找不到的條目。那麼,從t1獲取表名...

+0

感謝隊友,**這個作品**。我在同一時間或多或少地得到了答案。儘管我不想做子查詢,以避免丟失索引。這只是完整查詢的一部分,該查詢連接了另外4個表,並在一些表中獲得了幾百萬行。 – 2012-02-03 03:23:24

+0

@YohanLeafheart,請參閱使用LEFT JOIN/IS NULL上下文修訂後的答案。可能會更好地處理數百萬行...讓我知道... – DRapp 2012-02-03 03:35:45

+0

我會盡力明天做一個測試,並會在這裏報告。 – 2012-02-03 04:39:55

相關問題