mySQL查询,我应该使用CASE,UNION还是其他东西

时间:2011-06-02 23:39:56

标签: mysql ruby-on-rails-3

在rails中创建查询,我非常确定活动记录不支持此类查询。

有四个表(产品,公司,商店和product_inventories)

Product_Inventory表包含product_id,company_id,store_id。公司可能有也可能没有多家商店(百思买会有很多商店,而亚马逊有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

1 个答案:

答案 0 :(得分: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将查询挂钩。

相关问题