MySql加入三个关系并对该结果执行查询

时间:2012-04-03 21:04:24

标签: mysql sql

我正在尝试对MySql执行查询

SELECT model, price
FROM (SELECT *
      FROM product
      LEFT JOIN printer, laptop, pc
      ON product.model = printer.model = laptop.model = pc.model)

我知道这不是正确的语法,我试图找到每个产品的型号和价格。我首先尝试自然地将每个列表连接到产品但是想出了一个空集,因为第一个自然连接删除了其他两个产品的所有其他元组,然后下一个后续连接删除了所有内容。

我的真正问题是我应该使用什么类型的联接来执行此操作?

关系:

产品(制造商,型号,类型)

笔记本电脑(型号,价格,速度,内存,高清,屏幕)

PC(型号,价格,速度,内存,高清)

打印机(型号,价格,颜色,价格)

2 个答案:

答案 0 :(得分:0)

为什么SELECT x来自(SELECT ...)?右转到内部:

SELECT model, price
FROM product
LEFT JOIN printer, laptop, pc
ON product.model = printer.model = laptop.model = pc.model

显然这仍然不起作用,因为存在一些语法错误。您需要做的是多个连接:

SELECT model, price
FROM product
LEFT JOIN printer ON product.model = printer.model
LEFT JOIN laptop ON product.model = laptop.model
LEFT JOIN pc ON product.model = pc.model

现在,这是一个有效的查询,但我怀疑在你的数据中它不会起作用,因为你在每台打印机,笔记本电脑和个人电脑都有价格(所以你会混淆你的意思是“价格” )。可能有一个更好的方法,但你可以这样做:

SELECT model, COALESCE(printer.price, laptop.price, pc.price)
FROM product
LEFT JOIN printer ON product.model = printer.model
LEFT JOIN laptop ON product.model = laptop.model
LEFT JOIN pc ON product.model = pc.model

coalesce做的是返回第一个非NULL参数(因此如果printer.price为null而laptop.price不为,则返回laptop.price)。

答案 1 :(得分:0)

这是一个很好的解决方案:

SELECT model, COALESCE(pr.price, la.price, pc.price) AS price
FROM product AS p
LEFT JOIN printer AS pr ON (p.model=pr.model)
LEFT JOIN laptop AS la ON (p.model=la.model)
LEFT JOIN pc  ON (p.model=pc.model)

我应该注意到,您的表格结构可以根据您的目的进行增强,也可能用于您的应用程序。

而不是表格:

  • 产品(制造商,型号,型号)
  • 笔记本电脑(型号,价格,速度,内存,高清,屏幕)
  • PC(型号,价格,速度,内存,高清)
  • 打印机(型号,价格,颜色)

可能是:

  • 产品(制造商,型号,类型,价格)
  • 笔记本电脑(型号,速度,内存,高清,屏幕)
  • PC(型号,速度,内存,高清)
  • 打印机(型号,颜色)

甚至:

  • 产品(制造商,类型,价格,参考,其他特性)

其中[other_characteristics]列包含其他信息的json。