2014-03-25 63 views
0

我有這個表:中的hasMany所有條件都滿足查找

產品 - >的hasMany - >類別

表:產品

+----+--------+ 
| id | title | 
+----+--------+ 
| 1 | Prod 1 | 
| 2 | Prod 2 | 
| 3 | Prod 3 | 
+----+--------+ 

表:類

+----+-------+------------+ 
| id | title | product_id | 
+----+-------+------------+ 
| 1 | Cat 1 |   1 | 
| 2 | Cat 2 |   1 | 
| 3 | Cat 3 |   2 | 
| 4 | Cat 1 |   1 | 
+----+-------+------------+ 

我如何查詢在我的例子中的「Cat 1」和「Cat 2」兩個類別的產品,我只想找到「產品1」

回答

1

我的直覺是你應該改變數據庫,所以你反而有一個habtm關係。

所以,你的表應該是這樣的:

Products (id, title) 
ProductCategories (product_id, category_id) 
Categories (id, title) 

因此該產品可以屬於多個類別。

然後你可以看一下你的表屬於具有ID = 1和範疇ID = 3類產品,通過執行以下查詢:

MySQL查詢

SELECT Products.id, Products.title 
FROM Products 
WHERE 
Products.id IN 
(
    SELECT c1.product_id 
    FROM ProductCategories AS c1 
    INNER JOIN ProductCategories AS c2 
    ON c1.product_id = c2.product_id 
    WHERE c1.category_id = 1 AND c2.category_id = 3 
); 
+0

OK - 看起來不錯。現在我有最多5個category_ids匹配,所以我擴展了你的建議,並有5個內部連接。但是如果你想縮放這個並且有25個你想匹配的category_ids會發生什麼。 – MadeOfSport

+0

是的,我理解你的問題,我也有同樣的想法,但就目前而言,我沒有得到一個明智的解決方案.. 在CakePHP中,你可能可以做一些串聯的查詢字符串的所有類別..就像 foreach($ categories as $ category){$ query。= $ inner_join_for_this_category; } $ query; //現在包含所有內部連接 –