2011-06-16 151 views
0

說我有兩個表 - 我的MySQL數據庫中的「Table1」和「Table2」。 「Table1」中的「id」主鍵(auto_increment)是「Table2」 - 「tab_id」中的參考鍵。mysql query join/sub-query/union

對於一個「Table1」行,可能有零個或多個「Table2」行。

現在我試圖在「表格2」列中的某一列上搜索「電子郵件」列,或者在「表格1」列中的某一列上說「地址」並打印「表格1」行值。

我看到有3種可能性:1。 加入 2.子查詢 3.聯盟

1加入

SELECT * 
FROM Table1 t1, Table t2 
WHERE t1.id = t2.tab_id 
    AND (t1.address like '%str%' OR t2.email like '%str%'); 

- 這工作得很好,但是當沒有行在與「Table1」相關的「Table2」中,JOIN將失敗,因此輸出不一致。

2分查詢

SELECT * 
FROM Table1 t1 
WHERE t1.address like '%str%' 
    OR t1.id IN (SELECT t2.tab_id 
       FROM Table2 t2 
       WHERE t2.email like '%str%'); 

- 這工作得很好,但是當有 「表2」(比如5K)兩大manys行查詢會很慢:(

3聯盟

SELECT 'relevant_columns' 
FROM Table1 t1, Table t2 
WHERE t1.id = t2.tab_id 
    AND (t1.address like '%str%' OR t2.email like '%str%') 
UNION 
SELECT 'relevant_columns' 
FROM Table1 t1 
WHERE t1.address like '%str%' 
ORDER BY relevant_column 

- 這工作得很好,可能會創建一個類似工會認爲,做這項工作

ñ。我的問題什麼是正確的方式......可以總是調用一個UNION嗎?

MySQL的引擎:MyISAM數據

+0

不知道我明白你想要做什麼,但它聽起來像一個外部聯接的工作,而不是一個聯合。也許看看那個? – MJB 2011-06-16 12:31:32

回答

1
SELECT * 
FROM Table1 t1 
    LEFT JOIN Table2 t2 
     ON t1.id = t2.tab_id 
WHERE t1.address like '%str%' OR t2.email like '%str%'; 
2
SELECT * 
    FROM Table1 t1 
    LEFT JOIN Table t2 ON t2.tab_id = t1.id 
WHERE t1.address like '%str%' 
    OR t2.email like '%str%'; 
  1. 你需要做一個LEFT JOIN。當您像從前那樣從兩個表中創建FROM時,它的作用如同INNER JOIN(或者如果沒有WHERE子句,則爲CROSS JOIN),這意味着輸出僅顯示兩個表中都有匹配的行。用LEFT JOIN你說你想要左表(t1)中的所有行與右表(t2)上匹配的行。如果t2中沒有匹配,則使用null

  2. 您可以使用子查詢,但你可以看到它是不是最好的選擇

  3. UNION這裏不會給你帶來任何好處。 UNION對於將數據集合併到同一列非常有用。

編輯

如果你有加盟事宜,因爲一些表1的行不出現,那麼你需要一個LEFT JOIN。需要很長時間的事實是另一個問題。這些表格根本不大,所以我想你需要在這些表格上做一些索引工作。

如果您需要關於union的幫助,您需要告訴我哪些是relevant_columns,因爲它們必須具有相同數量的列,相同類型和相同序列。 您可以優化union而無需連接,具體取決於您在t2.email匹配時要輸出的內容。這裏是一個例子

SELECT t1.id, t1.address, null as email 
    FROM Table1 t1 
WHERE t1.address like '%str%' 
union 
SELECT t2.tab_id as id, null as address, t2.email 
    FROM Table t2 
WHERE t2.email like '%str%'; 
+0

感謝您的回覆。但是LEFT JOIN大約需要13秒,與簡單的(正如我寫的)相比,這需要0.13秒,而簡單的JOIN只有在「Table2」有一個或多個參考時才起作用,UNION大約需要0.16秒。 「Table1」有2600行,「Table2」有大約3000行 – user237865 2011-06-16 12:56:46

+0

@ user237865編輯完成 – 2011-06-16 13:53:12