当前位置: 首页 > 知识库问答 >
问题:

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

翟嘉志
2023-03-14

我有一个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)

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

如果有人可以帮助返工选择只包括每个产品一次,无论类别我将不胜感激的帮助。

将类别恢复为产品的MAX()category_id也会很有帮助,但如果这太过分了,那就没什么大不了的了。

谢谢你。

共有2个答案

谭健柏
2023-03-14

很可能是因为您使用了product_to_category产品之间的内部联接

从本质上讲,内部联接将创建尽可能多的连接,其中左联接将生成的结果限制在第一个(左)表中的元素。

公西国发
2023-03-14

如果使用“分组依据”,则无论产品类别如何,您都可以获得一次产品:

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的更多信息,您可以浏览以下手册页面:

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

 类似资料:
  • 我的searchBar文本正在更新我的查询,但没有像我预期的那样从Firestore返回数据。 这是我的数据模型中的方法: 这是我的视图控制器中的搜索栏方法: 我想知道我的模型中的是否可能是我的问题的根源。当我时,我键入的会按预期显示在控制台中。但是表视图不会更新具有匹配的单元格,即使它是完全匹配的。

  • 问题内容: 我有一个表,例如,具有ID,State和User_ID的Instrument作为列。 因此,我有这个JPA查询来返回具有匹配的User_ID的所有仪器记录。 它仅返回第一个记录,重复的次数与匹配记录的次数相同。 我在Db中有3条记录,仪器ID为1,2和3 我在hibernate状态下启用了show sql查询,该查询直接在数据库上运行良好,并返回了不同的记录。 hibernate查询:

  • 我有下面的火药结构。因此,我需要根据查询 到目前为止,我已经写了这个,它只适用于一个值。我如何将两者结合起来

  • 假设我已经包装了我的C类和,并且可以通过SWIG生成的模块从Python访问它们: 在Python中,我创建了面向用户的类,它是一个浅层代理,主要添加docstring,并允许IDE对参数名称进行制表符补全: 问题在于,返回类型为,它没有docstring,也不显示参数名称(swig将所有参数公开为)。相反,我希望它提供我自己的浅代理

  • 我有一个表,比如说,仪表,ID、State和User_ID作为列。 所以我有这个JPA查询来返回所有带有匹配User_ID的仪器记录。 它只返回第一条记录,重复次数与有匹配记录的次数一样多。 我有三张Db格式的唱片,仪器编号是1、2和3 我在hibernate上启用了ShowSQL查询,查询直接在数据库上运行良好,并返回不同的记录。 Hibernate查询: 工具实体 不知道我错过了什么。

  • Firebase查询返回此查询的值 该项由model类捕获 但是,返回null