mysql join 如何过滤到重复的行?

2018-08-09 13:57:28 +08:00
 zjsxwc

场景

产品表 product 有个字段叫做 shop_product_category_id 来表示 卖家设置的产品分类 id,产品也可以不设置卖家自己的分类此时分类 id 为 null,卖家会对这个产品分类添加访问密码,也可以不设置访问密码此时密码为 null,也就是表 shop_product_category 的 access_key 来存储。

业务需求

现在要查询得到没有分类访问密码限制的所有产品(没对产品分配产品分类或者已经分配分类但分类没设置密码),如图中 sql

https://i.loli.net/2018/08/09/5b6bd489b934c.png

碰到的问题

我碰到的问题是我写的这个 sql 会重复返回同样 id 的产品,比如图中的三个 1055,这样会导致 ORM 其实认为只查询到了 1 个对象,这就导致 LIMIT 20 其实并没有查询获得 20 个不同产品,所有我想要是 sql 如何返回每行的产品 id 都不同?

图里的 sql 如下

SELECT 
( p0_.id) AS id_0, 
p0_.account_id AS account_id_1, 
p0_.name AS name_2, 
p0_.shop_product_category_id AS shop_product_category_id, 
s1_.id AS spc_id,
s1_.name AS spc_name,
s1_.access_key AS spc_access_key

FROM product p0_ 
INNER JOIN shop_product_category s1_ 
ON 
((p0_.shop_product_category_id IS NULL) OR ((p0_.shop_product_category_id = s1_.id) AND ((s1_.access_key IS NULL) OR (LENGTH(s1_.access_key) = 0)))) 

WHERE 

(((MATCH(p0_.name) AGAINST ("坯布" IN NATURAL LANGUAGE MODE ) > 0.8))) AND p0_.status = 1 ORDER BY MATCH(p0_.name) AGAINST ("坯布" IN NATURAL LANGUAGE MODE ) DESC LIMIT 20 OFFSET 0
2458 次点击
所在节点    程序员
4 条回复
zjsxwc
2018-08-09 14:02:58 +08:00
好像 GROUP BY 可以

```

SET session sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));

SELECT

min( p0_.id) AS id_0,
p0_.account_id AS account_id_1,
p0_.name AS name_2,
p0_.shop_product_category_id AS shop_product_category_id,
s1_.id AS spc_id,
s1_.name AS spc_name,
s1_.access_key AS spc_access_key

FROM product p0_
INNER JOIN shop_product_category s1_
ON
((p0_.shop_product_category_id IS NULL) OR ((p0_.shop_product_category_id = s1_.id) AND ((s1_.access_key IS NULL) OR (LENGTH(s1_.access_key) = 0))))

WHERE

(((MATCH(p0_.name) AGAINST ("坯布" IN NATURAL LANGUAGE MODE ) > 0.8))) AND p0_.status = 1


GROUP BY p0_.id


ORDER BY MATCH(p0_.name) AGAINST ("坯布" IN NATURAL LANGUAGE MODE )

DESC LIMIT 20 OFFSET 0

```
saulshao
2018-08-09 15:20:47 +08:00
正常的做法就是 GROUP BY,你需要按什么去重,就 GROUP BY 哪(几)个字段
linuxsteam
2018-08-09 15:27:07 +08:00
distinct 不太好,之前用过,不过忘记什么原因放弃使用 distinct 了。
同意楼上看法,不过 group by 不是按照最后时间或者最新时间分组的
niubee1
2018-08-09 15:33:16 +08:00
先去重了再 join 子表

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/478258

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX