我有一个从表中选择产品的查询。一个产品可以有多个价格(考虑不同的价格)和一个默认价格。
当然,这是一对多的关系。我需要选择具有给定价格或默认价格的产品-这意味着相互排斥。我知道这可以通过单独的查询和WHERE(not)IN子句或union语句来完成,但我相信必须有一种更优化的方法。我的查询当前如下所示:

SELECT products.*, products_prices.price
FROM products RIGHT JOIN
     products_prices ON (products.id = products_prices.productId)
WHERE products_prices.businessId = ?
OR    products_prices.businessId IS NULL // this needs to become mutual.

编辑:我最终使用了这个查询,它是Gordon Linoff的:
 SELECT distinct p.*, coalesce(pp.price, defpp.price)
 FROM products p LEFT JOIN
      products_prices pp
      ON p.id = pp.productId and pp.businessId = ? left join
      products_prices defpp
      on p.id = defpp.productId and defpp.businessId is NULL

最佳答案

如果我正确理解您的问题,products表将具有默认价格,product_prices表将具有任何其他价格。
您想知道默认价格在哪里使用,这意味着没有其他价格。为此,请使用left outer join

SELECT p.*, coalesce(pp.price, p.default_price)
FROM products p LEFT OUTER JOIN
     products_prices pp
     ON p.id = pp.productId
WHERE pp.price = GIVENPRICE or pp.price is null

根据您的评论,您将默认价格存储在业务id为空的记录中。在这种情况下,我将对prices表执行两个连接:
SELECT p.*, coalesce(pp.price, defpp.price)
FROM products p LEFT OUTER JOIN
     products_prices pp
     ON p.id = pp.productId and pp.price = GIVENPRICE left outer join
     products_prices defpp
     on p.id = defpp.productId and defpp.businessId is NULL

第一个连接获取与给定价格匹配的价格。第二个是默认价格。如果存在第一个结果,则使用第一个结果,否则使用第二个结果。

关于mysql - SQL中的互斥值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15526050/

10-12 12:48