2012-02-22 21 views
-2

表1 - > ID,名稱
表2 - > ID,姓名,TEXT_VALUE,table1_id,table3_id
表3 - > ID,名稱是否有可能比較兩個不同的行左外加入?

SELECT * FROM `table1` 
LEFT OUTER JOIN table2 ON table1.id = table2.table1_id 
WHERE 
(
    (table2.table3_id = '7' AND table2.name like ('%test%')) 
) 
    AND 
(
     table2.table3_id = '1' and table2.text_value like ('%fast update%')) 
) 
GROUP BY table1.id 
ORDER BY table1.id desc 
+0

如果條件之間的相同的布爾運算符('和'),你可以刪除所有括號,因爲你不需要改變評價 – 2012-02-22 10:01:02

+1

的默認順序,我可以看到他是什麼要求@mazzucci,他想看看table1是否包含表3中的兩個請求記錄,因此是奇數AND。他所結束的是一個不可能的地方 – 2012-02-22 10:13:15

回答

1

是的,但你需要兩個連接可以這樣做:

  • 因爲你將加入到表2的兩倍,的一個聯接必須 使用別名。我選擇了t2
  • AND更改爲LEFT OUTER JOIN table2 AS t2 ON
  • 在查詢的其餘部分中,將table2更改爲t2
  • 當您使用GROUP BY時,您指定的所有列需要位於GROUP BY子句或聚合中。既然你沒有那樣做,而且你不清楚爲什麼你試圖使用GROUP BY,我將排除GROUP BY條款。

還有其他幾個變化。請參見下面的最終查詢:

SELECT 
    table1.id 
FROM 
    table1 
    LEFT OUTER JOIN 
    table2 
    ON table1.id = table2.table1_id 
    LEFT OUTER JOIN 
    table2 t2 
    ON table1.id = t2.table1_id 
WHERE 
    table2.table3_id = '7' 
    and 
    table2.name like '%test%' 
    AND 
    t2.table3_id = '1' 
    and 
    t2.text_value like '%fast update%' 
ORDER BY 
    table1.id DESC 
1

簡短的回答,是的。

更長的答案,幾次重讀您的問題後,將會工作,但不會是世界上最有效的查詢,我強烈要求您重新檢查您嘗試完成的內容以及是否表重組將是一個好主意。

我選擇了INNER JOIN,因爲您只對符合兩個條件的行感興趣,所以NULL行不重要。 HAVING子句確保僅輸出與兩者匹配的行,而在ON子句中具有table2限制則有助於限制性能影響。

SELECT 
    table1.*, 
    COUNT(DISTINCT(table3.id)) AS numberOfMatches 
FROM table1 


INNER JOIN table2 
ON table2.table1_id = table1.id 
AND (
    (table2.table3_id = 7 AND table2.name LIKE '%test%') 
    OR 
    (table2.table3_id = 1 AND table2.text_value LIKE '%fast update%') 
) 

INNER JOIN table3 
ON table3.id = table2.table3_id 

GROUP BY table1.id 
HAVING numberOfMatches = 2 
ORDER BY table1.id DESC 
0
SELECT * 
FROM `table1` a LEFT OUTER JOIN table2 b ON a.id = b.table1_id 
WHERE 
(
    b.table3_id = '7' AND b.name like '%test%' 
) 
    AND 
(
     b.table3_id = '1' and b.text_value like '%fast update%' 
) 
GROUP BY a.id 
ORDER BY a.id desc 
相關問題