Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在选定多个列的SELECT中使用Distinct(col)_Sql - Fatal编程技术网

Sql 在选定多个列的SELECT中使用Distinct(col)

Sql 在选定多个列的SELECT中使用Distinct(col),sql,Sql,我的目标是返回一个不同的“mFrom”列表,并且只从“messages”表中提取最新的“date” Table: messages id mFrom mTo date -- ----- --- ---- int int int datetime 我正在尝试使用此查询: SELECT DISTINCT(mFrom), date FROM messages WHERE mTo = '116' 但我收到了这些结果: mFrom da

我的目标是返回一个不同的“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看到了类似的答案,但在为我的特定字段生成可比较的查询时遇到了问题

分组方式似乎是正确的

SELECT mFrom, MAX(date) as date 
FROM messages 
WHERE mTo = '116' 
GROUP BY mFrom
您可以看到日期时间字段,时间缩短了几秒钟

你能做的就是

SELECT DISTINCT(mFrom), cast(date as date) FROM messages WHERE mTo = '116'
这将删除时间并给您

mFrom date
9 | 2016-11-17 
11 | 2016-11-17 

假设你有更多的专栏是独一无二的,例如,你想从mFrom得到最新的消息,但你也想要mTo。然后,您应该考虑分区行号。对于支持Windows功能的系统,例如sql server,通常会有一个
ROW\u NUMBER()
函数供您使用。下面是一个使用公共表表达式[CTE]和
ROW\u 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技术并将其与原始表关联,或者在或EXISTS中,如果mFrom的两条消息共享相同的MAX(日期),则所有这些方法都将返回ties。下面是一个带有连接的示例

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

这将给出不同的mFrom和日期组合。OP只需要每个mFrom的最新消息。然后我们需要使用MAXExplain解释为什么您认为11的两个日期不“不同”。我删除了不兼容的数据库标记。
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