我有一个我编码的监视列表系统,在用户监视列表的概述中,他们会看到一个记录列表,但是在数据库中列表显示重复,它只显示确切的正确数字.
我试过了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博士所说,"当你选择不做决定时,你仍然做出了选择."
| 归档时间: |
|
| 查看次数: |
44015 次 |
| 最近记录: |