2012-06-14 72 views
2
table products 
-------------- 
id | title 
1 | Product 1 
2 | Product 2 
3 | Product 3 

table categories 
---------------- 
id | title 
1 | Cat 1 
2 | Cat 2 
3 | Cat 3 

table products_categories_mm 
---------------- 
id_local | id_foriegn 
1  | 2 
1  | 3 
2  | 3 
3  | 2 

 如何找到有多個關係記錄第二個表

SELECT * 
FROM products 
    JOIN products_categories_mm ON products.uid=products_categories_mm.uid_local 
    JOIN categories ON products_categories_mm.uid_foreign = categories.uid 
WHERE products.lang_uid IN (0) 
    AND products.page >= 1 
    AND products.page IN (8,9,10,11) 
    AND categories.uid IN (2,3) 
ORDER BY products.datetime DESC 

上面找到相關的類別2和3。它返回的產品記錄1,2和3這是精細的所有產品並按我的意願工作。但現在我需要調整查詢,以便它返回與類別2和類別3相關的產品。

在這種情況下,查詢應該返回產品1(因爲它是唯一與這兩個類別相關的產品)。

我試圖改變我的SQL語句:

SELECT * 
FROM products 
    JOIN products_categories_mm ON products.uid=products_categories_mm.uid_local 
    JOIN categories ON products_categories_mm.uid_foreign = categories.uid 
WHERE products.lang_uid IN (0) 
    AND products.page >= 1 
    AND products.page IN (8,9,10,11) 
    AND (categories.uid = 2 AND categories.uid = 3) 
ORDER BY products.datetime DESC 

但這沒有返回。 EXPLAIN說有一個不可能的where子句。

如何更改我的SQL以獲取我想要的記錄?

回答

1

SQL的解釋是因爲2和3的UID將出現在不同的行中,所以不可能有一個UID爲2和3的行。最好做一個不同的方法...例如說一個子查詢。

+0

你能舉個例子嗎?我從來沒有必須使用子查詢之前 –

1
SELECT 
    a.* 
FROM 
    products a 
INNER JOIN 
    products_categories_mm b ON a.uid = b.uid_local 
WHERE 
    a.lang_uid = 0 
    AND a.page IN (8,9,10,11) 
    AND b.uid_foreign IN (2,3) 
GROUP BY 
    a.uid 
HAVING 
    COUNT(*) = 2 
ORDER BY 
    a.datetime DESC 

COUNT(*) = 22代表要檢查類別的數量。如果您希望產品僅在滿足3或4個類別時才顯示,請相應更改該號碼。

+0

這就行了!我只需看看如何使用我的CMS的API重新編寫我的查詢來創建上述SQL。 –

1

它抱怨,因爲你在這一行簡單的邏輯錯誤:

AND (categories.uid = 2 AND categories.uid = 3) 

它不可能是兩個值,只有一個或另一個。您一定意味:

AND (categories.uid = 2 OR categories.uid = 3) 

這也可以被改寫爲:

AND (categories.uid IN (2,3)) 

順便說一句,什麼是點:

AND products.page >= 1 

如果你進一步將其過濾:

AND products.page IN (8,9,10,11) 

你不需要這個的第一位。

相關問題