背景

突然发现博客列表页会出现重复的项,原以为是程序BUG(数据多储存了)。经检查发现 是SQL查询结果出现重复项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT 
articles_id,
articles_title,
articles_date
FROM
`articles`
INNER JOIN `article_sort` ON article_sort.article_id = articles.articles_id
INNER JOIN `sorts` ON sorts.sort_id = article_sort.sort_id
WHERE
(
sorts.sort_name = ""unity"")
AND (
articles.articles_state = 1)
ORDER BY
`articles_date` DESC

数据库
图片

显示结果
图片2

解决办法

当时直接想到的是加DISTINCT进行去重,效果确实能够达到且立竿见影,除此之外,也可以在语句末尾添加group by b_id来实现同样的效果。
但是不能只知其然,后来发现,是自己join的表没有关联主键或者说是value唯一性的字段。
通过对该表以该字段查询后发现确实存在两行数据,换言之,如果在c表中查询该字段对应的数据后
SELECT * FROM c WHERE c.network_id = '123456789'
结果显示数据有n行,那么根据笛卡尔积,left join 将会产生m * n条数据,会重复n倍。

原文连接

DISTINCT

从表中查询数据时,可能会收到重复的行记录。为了删除这些重复行,可以在SELECT语句中使用

DISTINCT 子句

DISTINCT子句的语法如下

1
2
3
4
5
6
SELECT DISTINCT
columns
FROM
table_name
WHERE
where_conditions;
MySQL DISTINCT语句

背景

突然发现博客列表页会出现重复的项,原以为是程序BUG(数据多储存了)。经检查发现 是SQL查询结果出现重复项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT 
articles_id,
articles_title,
articles_date
FROM
`articles`
INNER JOIN `article_sort` ON article_sort.article_id = articles.articles_id
INNER JOIN `sorts` ON sorts.sort_id = article_sort.sort_id
WHERE
(
sorts.sort_name = ""unity"")
AND (
articles.articles_state = 1)
ORDER BY
`articles_date` DESC

数据库
图片

显示结果
图片2

解决办法

当时直接想到的是加DISTINCT进行去重,效果确实能够达到且立竿见影,除此之外,也可以在语句末尾添加group by b_id来实现同样的效果。
但是不能只知其然,后来发现,是自己join的表没有关联主键或者说是value唯一性的字段。
通过对该表以该字段查询后发现确实存在两行数据,换言之,如果在c表中查询该字段对应的数据后
SELECT * FROM c WHERE c.network_id = '123456789'
结果显示数据有n行,那么根据笛卡尔积,left join 将会产生m * n条数据,会重复n倍。

原文连接