0

我正在尝试对 MySql 执行这样的查询

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

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

我真正的问题是我应该使用哪种类型的连接来执行此操作?

关系:

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

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

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

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

4

2 回答 2

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 )

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

于 2012-04-03T21:20:22.337 回答
0

为什么 SELECT x from (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)。

于 2012-04-03T21:09:08.093 回答