![](/img/trans.png)
[英]Select DISTINCT on one column that returns multiple columns using more than one table
[英]Using Distinct(col) in a SELECT with more than one column selected
我的目标是返回“ mFrom”的唯一列表,并仅从“ messages”表中提取最新的“ date”。
Table: messages
id mFrom mTo date
-- ----- --- ----
int int int datetime
我正在尝试使用以下查询:
SELECT DISTINCT(mFrom), date FROM messages WHERE mTo = '116'
但是正在收到以下结果:
mFrom date
9 | 2016-11-17 00:30:03
11 | 2016-11-17 12:35:08
11 | 2016-11-17 12:35:35
我想看看这些结果。
mFrom date
9 | 2016-11-17 00:30:03
11 | 2016-11-17 12:35:35
任何帮助表示赞赏。 使用GROUP BY和内部SELECT看到了类似的答案,但是在针对我的特定字段提出类似的查询时遇到了麻烦。
GROUP BY似乎正确。
SELECT mFrom, MAX(date) as date
FROM messages
WHERE mTo = '116'
GROUP BY mFrom
假设您有更多在游戏中唯一的列,例如,您想要来自mFrom的最新消息,但同时也想要mTo。 然后,您应该考虑分区的行号。 对于支持Windows功能的系统(例如sql-server),通常它们将具有您可以使用的ROW_NUMBER()
函数。 这是使用公用表表达式[CTE]和ROW_NUMBER()
的示例。 请注意,改用RANK()或DENSE_RANK()将允许平局。
;WITH cte AS (
SELECT *
,ROW_NUMBER() OVER (PARTITION BY mFrom ORDER BY Date DESC) as RowNumber
FROM
Messages
WHERE
mTo = 116
)
SELECT *
FROM
cte
WHERE
RowNumber = 1
在我的sql中,这变得更加复杂,您可以通过使用变量来做到这一点:
SELECT *
FROM
(
SELECT
m.*
,(@rn:= if(@mFrom = mFrom, @rn + 1,
if(@mFrom:=mFrom, 1, 1)
)) as RowNumber
FROM
Messages m
CROSS JOIN (SELECT @mFrom:=0, @rn:=0) var
WHERE
mTo = 116
) t
WHERE
t.RowNumber = 1
或在任何一个系统中,都可以使用Gareth显示的GROUP BY技术并将其关联回原始表,或者IN或EXISTS,如果mFrom的2条消息共享相同的MAX(date),则所有这些方法都将返回联系。 这是一个带有连接的示例。
SELECT *
FROM
Messages m
INNER JOIN (SELECT mFrom, MAX(date) as date
FROM
Messages
WHERE
mTo = 116
GROUP BY
mFrom) t
ON m.mFrom = t.mFrom
AND m.date = t.date
WHERE
mTo = 116
11 | 2016-11-17 12:35:08
11 | 2016-11-17 12:35:35
您可以看到日期时间字段,时间间隔为几秒钟。
你可以做的是
SELECT DISTINCT(mFrom), cast(date as date) FROM messages WHERE mTo = '116'
这将节省时间并给您
mFrom date
9 | 2016-11-17
11 | 2016-11-17
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.