2011-06-02 85 views
0

在rails中創建一個查詢,我非常確定活動記錄不會支持這種類型的查詢。mySQL查詢,我應該使用CASE,UNION或其他東西

有四個表(產品,企業,商店和product_inventories)

有包含的product_id,COMPANY_ID,STORE_ID一個Product_Inventory表。一家公司可能會或可能不會有很多商店(百思買將有很多商店,而亞馬遜會有1家)。如果一行只包含產品和公司,所有商店都包含該產品,但如果該商店包含商店,則僅適用於該單一位置。

Product -> Product_Inventory -> Companies -> Stores 
OR 
Product -> Product_Inventory -> Stores 

目標:我希望能夠查詢產品並查找產品的所有位置。

我有什麼:

SELECT DISTINCT s.*, c.* FROM product_inventory p_inv 
    INNER JOIN stores s ON 
    (p_inv.store_id = s.id    #SKIP when p_inv.store_id IS NULL 
    OR 
    p_inv.company_id = s.company_id)  #SKIP when p_inv.store_id IS NOT NULL 
    INNER JOIN companies c ON s.company_id = c.id 
    WHERE p_inv.product_id = 1 

回答

0

所以,你的表基本上是這樣的:

Table pr_inv 
p_id, c_id, s_id 
1  1  NULL 
2  1  1 
3  1  2 
4  2  NULL 

Table products 
pid 
1 
2 
3 
4 
Table companies 
cid 
1 
2 

Table stores 
sid 
1 
2 

最後,你想獲得由公司所擁有的所有門店。 (我正在倒退)。

首先,您希望獲得所有擁有產品的公司。

SELECT DISTINCT c.* FROM (
    SELECT * FROM pr_inv WHERE p_id = 1 
) as prod_id 
INNER JOIN 
companies as c 
ON prod_id.c_id = c.cid 

這將返回所有擁有該產品的公司。這是你已經擁有的部分。

SELECT DISTINCT s.* FROM (
    SELECT * FROM pr_inv WHERE p_id = 1 
) as prod_id 
INNER JOIN 
stores as s 
ON prod_id.s_id = s.sid 

獲得您感興趣的所有商店,除非商店爲空。

SELECT s.* FROM (
    SELECT * FROM pr_inv WHERE p_id = 1 AND stores = null 
) as prod_id 
INNER JOIN company as c ON pr_inv.c_id = c.cid 
LEFT JOIN stores as s ON s.cid = c.cid 

獲取所有您感興趣的商店,商店爲空。最後,您可以使用JOIN將查詢連接在一起。