Php 查询返回基于类别的重复产品
我有一个mysql查询,它连接5个不同的表以返回产品的特定属性。每种产品只应退货一次。但是,由于产品可能有多个类别,它会为每个类别返回一次产品 以下是选择: 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) 选择不同的 pd.name作为pname, p、 价格作为价格, cd.name作为cname, pd.描述为pd说明, pd.language\u id作为language\u id, pd.产品id作为产品id, p、 以身作则,, p、 sku作为sku, p、 upc作为upc, m、 品牌名称 从{$this->prefix}产品描述pd 左连接{$this->prefix}产品到类别pc 打开(pd.product\U id=pc.product\U id) 内部联接{$this->prefix}产品p ON(pd.product\U id=p.product\U id) 左连接{$this->prefix}类别描述cd 打开(cd.category\u id=pc.category\u id 和cd.language\u id=pd.language\u id) 左连接{$this->prefix}m ON(m.manufacturer\u id=p.manufacturer\u id) 如果给定的产品(例如product_id 32)被分配到多个类别,它将为每个类别返回product_id 32一次,唯一的区别是结果Php 查询返回基于类别的重复产品,php,mysql,sql,Php,Mysql,Sql,我有一个mysql查询,它连接5个不同的表以返回产品的特定属性。每种产品只应退货一次。但是,由于产品可能有多个类别,它会为每个类别返回一次产品 以下是选择: SELECT DISTINCT pd.name AS pname, p.price AS price, cd.name AS cname, pd.description AS pdescription, pd.language_id AS language_id
cname
是类别名称
如果有人能够帮助重新设计select,使每个产品只包含一次,无论是哪一类,我都会非常感谢您的帮助
将category返回为产品的MAX()category_id也会很有帮助,但如果这要求太高,那也不是什么大问题
谢谢。如果您使用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)作为cname
有关GROUP BY的更多信息,请浏览以下手册页面:
如果您使用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)作为cname
有关GROUP BY的更多信息,请浏览以下手册页面:
很可能是因为您在
产品到类别和产品之间使用了内部联接
本质上,内部联接将建立尽可能多的连接,其中左联接将产生的结果限制到第一个(左)表中的元素。最有可能是因为您使用的是内部联接
介于产品与产品之间
本质上,内部联接将建立尽可能多的连接,其中左联接将生成的结果限制为第一个(左)表中的元素。SHOW CREATE table tablename代码>和示例数据。更好地使用它。SHOW CREATE TABLE tablename代码>和示例数据。更好地使用它。我想可能也是这样,但即使使用左连接,它仍然会带来所有类别。我认为Neels使用GROUP BY的答案是正确的。我也认为可能是这样,但即使是左撇子加入,它仍然会带来所有类别。我认为Neels使用GROUP BY的答案是正确的。谢谢你,Neels,这似乎成功了。至于MAX函数。。。MAX在var char列上起作用吗?也许我错误地认为MAX只适用于整数?是的。。MAX为Varchar工作。。只是它返回VARCHAR字段的最大ASCII值。您可能无法获得预期的结果!老实说,这并不是非常重要,这篇文章是用来创建元描述的,所以只要选择了一个正确的类别就可以了。再次感谢你的帮助。我接受了你的回答。我希望这里有更多像你这样的人可以把他们的自尊心留在门口。我非常感谢你的时间:)谢谢你,尼尔斯,这似乎已经成功了。至于MAX函数。。。MAX在var char列上起作用吗?也许我错误地认为MAX只适用于整数?是的。。MAX为Varchar工作。。只是它返回VARCHAR字段的最大ASCII值。您可能无法获得预期的结果!老实说,这并不是非常重要,这篇文章是用来创建元描述的,所以只要选择了一个正确的类别就可以了。再次感谢你的帮助。我接受了你的回答。我希望这里有更多像你这样的人可以把他们的自尊心留在门口。非常感谢您抽出时间:)