MySQL - 选择项目列表,加入价目表 - >特殊价格何时存在其他违约

时间:2011-11-20 16:49:30

标签: mysql join

我的第一张桌子是一张物品表。 (invoice_inventory) 我的第二个表是价格表(inventory_prices),我有一个默认价格表(company_id = 0)和几个特殊价格表(但不是每个公司都有)。

通过以下查询,我尝试获取所有项目,其中包含company_id = 2的价格。 它应该使用特殊价格表(如果存在,则为company_id = 2),否则它应该使用默认价格(company_id = 0)。

我认为通过GROUPING + ORDERING它会起作用,但我忘记GROUP BYORDER之前执行了。

我想我可能需要一个子查询,但我不确定。

SELECT invoice_inventory.*, invoice_inventory_prices.* 
FROM invoice_inventory
LEFT JOIN invoice_inventory_prices 
   ON  `invoice_inventory`.`inventory_id`
      = `invoice_inventory_prices`.`inventory_id`
WHERE (company_id = 2 OR company_id = 0)
GROUP BY invoice_inventory.inventory_id 
ORDER BY company_id DESC

2 个答案:

答案 0 :(得分:2)

我将使用两个LEFT JOIN s,第一个将获得默认价格dp alias,第二个将获得特价(company_id = 2)sp alias

CASE用于确定是否存在特价,使用它,否则使用默认值。

您没有列出列表,因此我猜测了价格列的名称。如果您需要第二列(或更多列),则可以添加其他CASE语句。

SELECT i.inventory_id
   , CASE
        WHEN sp.Price IS NOT NULL THEN sp.Price
        ELSE dp.Price
     END AS PriceForItem
FROM invoice_inventory AS i
LEFT JOIN invoice_inventory_prices AS dp ON  i.inventory_id = dp.inventory_id
   AND dp.company_id = 0
LEFT JOIN invoice_inventory_prices AS sp ON  i.inventory_id = sp.inventory_id
   AND sp.company_id = 2
GROUP BY invoice_inventory.inventory_id 

答案 1 :(得分:0)

也许您可以使用GROUP_CONCAT并将company_id = 2和company_id = 0的价格结果作为字段中的数组获得,然后您可以解析它,以便您可以尝试以这种方式更改查询:

SELECT invoice_inventory.inventory_id AS id, GROUP_CONCAT(invoice_inventory_prices.price) AS prices 
FROM invoice_inventory

使用GROUP_CONCAT,您将在字段价格中获得主要价格和默认价格作为数组元素:

+----+-------------------------+
| id |        prices           |
+----+-------------------------+
|  3 | 5,6                     |
+----+-------------------------+

例如5是特价,6是默认价格......