【问题标题】:Query Returns Duplicate Products Based On Category查询返回基于类别的重复产品
【发布时间】:2014-03-25 17:09:51
【问题描述】:

我有一个 mysql 查询,它连接 5 个不同的表以返回产品的特定属性。它应该只退回每个产品一次。但由于产品可能有多个类别,它会为每个类别返回一次产品。

这里是选择:

选择不同的 pd.name 作为 pname, p.price AS 价格, cd.name AS cname, pd.description 作为 pdescription, pd.language_id AS language_id, pd.product_id AS product_id, p.model AS 模型, p.sku 作为 sku, p.upc 作为 upc, m.name AS 品牌 FROM {$this->prefix}product_description pd 左连接 {$this->prefix}product_to_category pc 开(pd.product_id = pc.product_id) INNER JOIN {$this->prefix}product p 开(pd.product_id = p.product_id) 左连接 {$this->prefix}category_description cd 开(cd.category_id = pc.category_id AND cd.language_id = pd.language_id) LEFT JOIN {$this->prefix}manufacturer m 开(m.manufacturer_id = p.manufacturer_id)

如果给定的产品,比如 product_id 32 分配给多个类别,它将为每个类别返回一次 product_id 32,唯一的区别是结果 cname 是类别名称。

如果有人可以帮助修改选择以仅包含每个产品一次,无论类别如何,我都将不胜感激。

将类别返回为产品的 MAX() category_id 也会很有帮助,但如果要求太多,也不是什么大问题。

谢谢。

【问题讨论】:

  • SHOW CREATE TABLE tablename; 和样本数据。最好使用SQLFiddle

标签: php mysql sql


【解决方案1】:

如果您使用 GROUP BY,则无论类别如何,您都可以获得每个产品一次:

SELECT DISTINCT 
pd.name AS pname, 
p.price AS price, 
cd.name AS cname, 
pd.description AS pdescription, 
pd.language_id AS language_id, 
pd.product_id AS product_id, 
p.model AS model, 
p.sku AS sku, 
p.upc AS upc, 
m.name AS brand 
FROM {$this->prefix}product_description pd 
LEFT JOIN {$this->prefix}product_to_category pc 
ON (pd.product_id = pc.product_id) 
INNER JOIN {$this->prefix}product p 
ON (pd.product_id = p.product_id) 
LEFT JOIN {$this->prefix}category_description cd 
ON (cd.category_id = pc.category_id AND cd.language_id = pd.language_id) 
LEFT JOIN {$this->prefix}manufacturer m 
ON (m.manufacturer_id = p.manufacturer_id)
GROUP BY product_id;

为了获得 MAX() 类别,您可以尝试将此 MAX 函数应用于您想要的列。我猜在这种情况下应该是MAX(cd.name) AS cname

有关 GROUP BY 的更多信息,您可以浏览以下手册页:

https://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

【讨论】:

  • 谢谢尼尔斯,这似乎成功了。至于 MAX 函数... MAX 在 var char 列上起作用吗?也许我错误地认为 MAX 仅适用于整数?
  • 是的.. MAX 适用于 Varchar.. 只是它返回 VARCHAR 字段的 MAX ASCII 值..您可能无法获得预期的结果!
  • 老实说,这并不是很重要,这篇文章用于创建元描述,只要选择一个正确的类别就可以了。再次感谢你的帮助。我接受了你的回答。我希望这里有更多像你这样的人可以把他们的自负留在门口。我非常感谢你的时间:)
【解决方案2】:

很可能是因为您在product_to_categoryproduct 之间使用了INNER JOIN

本质上,内连接将建立尽可能多的连接,其中左连接会将产生的结果限制为第一个(左)表中的元素。

【讨论】:

  • 我认为可能也是这样,但即使是左连接,它仍然会带来所有类别。我认为 Neels 使用 GROUP BY 的答案是正确的。
猜你喜欢
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 2020-01-03
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多