Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 查询返回基于类别的重复产品_Php_Mysql_Sql - Fatal编程技术网

Php 查询返回基于类别的重复产品

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

我有一个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一次,唯一的区别是结果
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值。您可能无法获得预期的结果!老实说,这并不是非常重要,这篇文章是用来创建元描述的,所以只要选择了一个正确的类别就可以了。再次感谢你的帮助。我接受了你的回答。我希望这里有更多像你这样的人可以把他们的自尊心留在门口。非常感谢您抽出时间:)