【问题标题】:Select record from 3 tables using inner and outer join in mysql在 mysql 中使用内部和外部联接从 3 个表中选择记录
【发布时间】:2015-11-01 23:32:13
【问题描述】:

我想从oc_product, oc_product_description, oc_product_special 中选择记录product_id product_name actual_price discount_priceoc_product_special 表包含产品的折扣价,但在某些产品上没有折扣,即 discount_price=0.0000。我想用他们的 discount_price 选择所有 40 种产品,如果 discount_price=0.0000 则在该行打印 NULL。

我试过的查询是:

SELECT oc_product_description.product_id,oc_product_description.name product_name, oc_product.price actual_price, oc_product_special.price discount_price 
FROM oc_product 
INNER JOIN oc_product_description 
RIGHT OUTER JOIN oc_product_special ON oc_product_description.product_id = oc_product.product_id = oc_product_special.product_id`

它返回错误的输出,例如

product_id  product_name    actual_price    discount_price
  NULL            NULL             NULL            0.0000
  NULL            NULL             NULL            0.0000
  NULL            NULL             NULL            0.0000
  NULL            NULL             NULL            0.0000
  NULL            NULL             NULL            0.0000
  NULL            NULL             NULL            0.0000
  NULL            NULL             NULL            1950.0000
  NULL            NULL             NULL            3850.0000
  NULL            NULL             NULL            7500.0000

我希望得到这样的输出:

product_id  product_name    actual_price    discount_price
  1               yyyy             1000.0000      0.0000
  2               xxxx             2000.0000      500.0000

【问题讨论】:

  • 为您的表提供示例数据集
  • 请显示 ddl。
  • 您说的是 0.000,您希望该行中有 NULL,但您想要的结果显示为 0.000。这是一个错字,还是我误读了这个问题?
  • 请注意,RIGHT JOIN 的使用极为罕见。对于每个 RIGHT JOIN,(理论上)都有一个功能相同的 LEFT JOIN,大多数人(包括我在内)会发现它更直观。我说“理论上”只是因为偶尔,在更复杂的查询中,很难弄清楚等价的 LEFT JOIN 是什么!

标签: mysql join inner-join outer-join


【解决方案1】:

一些事情;

oc_productoc_product_description 之间的连接条件应该是它们之间的内部连接,而不是与第三个表的外部连接;

INNER JOIN oc_product_description 
  ON oc_product.product_id = oc_product_description.product_id

在这种情况下,您的外连接上的条件应该只包含该表上的条件;

RIGHT OUTER JOIN oc_product_special 
  ON oc_product.product_id = oc_product_special.product_id

另外,由于您可能总是希望商品的描述始终存在,并且特价是可选的,您可能应该使用LEFT JOIN 而不是RIGHT JOIN

这将导致最终查询类似于;

SELECT oc_product_description.product_id,oc_product_description.name product_name, 
       oc_product.price actual_price, oc_product_special.price discount_price 
FROM oc_product 
INNER JOIN oc_product_description 
  ON oc_product.product_id = oc_product_description.product_id
LEFT OUTER JOIN oc_product_special 
  ON oc_product.product_id = oc_product_special.product_id

【讨论】:

  • 附带说明,oc_product_description.product_id = oc_product.product_id = oc_product_special.product_id 不会检查所有 3 个值是否相同,因为您需要类似 oc_product_description.product_id = oc_product.product_id AND oc_product_special.product_id = oc_product_description.product_id
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 2017-12-30
相关资源
最近更新 更多