GROUP BY不会删除重复项

Mac*_*Mac 10 mysql group-by

我有一个我编码的监视列表系统,在用户监视列表的概述中,他们会看到一个记录列表,但是在数据库中列表显示重复,它只显示确切的正确数字.

我试过了GROUP BY watch.watch_id,我试过GROUP BY rec.record_id的任何类型的组都没有删除重复项.我不确定我做错了什么.

SELECT watch.watch_date,
       rec.street_number,
       rec.street_name,
       rec.city,
       rec.state,
       rec.country,
       usr.username
FROM
(
    watchlist watch 

    LEFT OUTER JOIN records rec ON rec.record_id = watch.record_id

    LEFT OUTER JOIN members usr ON rec.user_id = usr.user_id
)
WHERE  watch.user_id = 1 
GROUP BY watch.watch_id
LIMIT 0, 25
Run Code Online (Sandbox Code Playgroud)

监视列表表如下所示:

+----------+---------+-----------+------------+
| watch_id | user_id | record_id | watch_date |
+----------+---------+-----------+------------+
|       13 |       1 |        22 | 1314038274 |
|       14 |       1 |        25 | 1314038995 |
+----------+---------+-----------+------------+
Run Code Online (Sandbox Code Playgroud)

Mal*_*lio 25

GROUP BY不会"删除重复项".GROUP BY允许聚合.如果您只想组合重复的行,请使用SELECT DISTINCT.

如果需要组合在某些列中重复的行,请使用GROUP BY,但您需要指定如何处理其他列.您可以省略它们(不在SELECT子句中列出它们)或聚合它们(使用SUM,MIN和AVG等函数).例如:

SELECT watch.watch_id, COUNT(rec.street_number), MAX(watch.watch_date)
... GROUP by watch.watch_id
Run Code Online (Sandbox Code Playgroud)

编辑

OP要求澄清一些.

考虑"视图" - 由FROM和JOIN以及WHERE组合在一起的所有数据 - 调用V.您可能想要做两件事.

首先,您可能完全重复了要组合的:

a b c
- - -
1 2 3
1 2 3
3 4 5
Run Code Online (Sandbox Code Playgroud)

然后只需使用DISTINCT

SELECT DISTINCT * FROM V;

a b c
- - -
1 2 3
3 4 5
Run Code Online (Sandbox Code Playgroud)

或者,您可能要部分重复要组合的:

a b c
- - -
1 2 3
1 2 6
3 4 5
Run Code Online (Sandbox Code Playgroud)

前两行在某种意义上是"相同的",但在另一种意义上明显不同(特别是,它们不会被SELECT DISTINCT组合).你必须决定如何组合它们.您可以将列c丢弃为不重要:

SELECT DISTINCT a,b FROM V;

a b
- -
1 2
3 4
Run Code Online (Sandbox Code Playgroud)

或者你可以对它们进行某种聚合.你可以添加它们:

SELECT a,b, SUM(c) "tot" FROM V GROUP BY a,b;

a b tot
- - ---
1 2 9
3 4 5
Run Code Online (Sandbox Code Playgroud)

您可以添加选择最小值:

SELECT a,b, MIN(c) "first" FROM V GROUP BY a,b;

a b first
- - -----
1 2 3
3 4 5
Run Code Online (Sandbox Code Playgroud)

或者你可以采用均值(AVG),标准偏差(STD),以及为c获取一堆值并将它们合并为一个的许多其他函数中的任何一个.

什么不是一个真正的选择是什么都不做.如果只列出未分组的列,DBMS将抛出错误(Oracle会这样做 - 正确的选择,imo)或者随机选择一个或多或少的值(MySQL).但正如Peart博士所说,"当你选择不做决定时,你仍然做出了选择."