SQL查找最新日期,为什么需要“内部联接”

SQL查找最新日期,为什么需要“内部联接”,sql,database,Sql,Database,我正在尝试使用SQL获取最新的结果。我搜索了网站,从“stackoverflow”中找到了这篇旧文章,链接: 我在这里复制了最被接受的答案 Select u.[username] ,u.[ip] ,q.[time_stamp] From [users] As u Inner Join ( Select [username] ,max(time_stamp) as [time_stamp] From [users] Group B

我正在尝试使用SQL获取最新的结果。我搜索了网站,从“stackoverflow”中找到了这篇旧文章,链接:

我在这里复制了最被接受的答案

Select u.[username]
      ,u.[ip]
      ,q.[time_stamp]
From [users] As u
Inner Join (
    Select [username]
          ,max(time_stamp) as [time_stamp]
    From [users]
    Group By [username]) As [q]
On u.username = q.username
And u.time_stamp = q.time_stamp
我不明白的是,为什么我们不能简单地使用下面的方法:在这种情况下,为什么需要“内部联接”操作

Select username, ip, max(time_stamp) as time_stamp
    From users
    Group By username

我相信,除了MySQL之外,大多数SQL变体都要求选择列表中的任何非聚合列也包含在分组中。否则,对于具有多个ip值的单个用户名,应在结果中显示哪一个?在这种情况下,您可能知道用户名/ip对是唯一的,但SQL引擎可能并不总是知道这一点,特别是对于更复杂的查询

举例说明:

用户:

username      ip              timestamp
--------      --------------  ---------
bob           167.49.122.122  2016-01-05
john          167.49.122.123  2016-02-02
bob           167.49.122.124  2016-04-01
你希望看到什么样的结果?给鲍勃

应该是bob/167.49.122.122/2016-04-01吗?bob/167.49.122.124/2016-04-01?两者都有


您可能会说,很明显,我希望整行都有max date,但这在您的第二次选择中并不明显,即使这对人类来说似乎很直观。

除了MySQL之外,大多数SQL变体都要求您的选择列表中的任何非聚合列也在您的分组中。否则,对于具有多个ip值的单个用户名,应在结果中显示哪一个?在这种情况下,您可能知道用户名/ip对是唯一的,但SQL引擎可能并不总是知道这一点,特别是对于更复杂的查询

举例说明:

用户:

username      ip              timestamp
--------      --------------  ---------
bob           167.49.122.122  2016-01-05
john          167.49.122.123  2016-02-02
bob           167.49.122.124  2016-04-01
你希望看到什么样的结果?给鲍勃

应该是bob/167.49.122.122/2016-04-01吗?bob/167.49.122.124/2016-04-01?两者都有


您可能会说,很明显,我希望整行都有最长日期,但从您的第二次选择来看,这并不明显,即使这对人来说很直观。

您的语法建议使用SQL Server或MS Access,但我会持乐观态度。ANSI标准SQL中的典型方法是使用行号:


当然也有其他方法不需要显式连接。

您的语法建议使用SQL Server或MS Access,但我还是乐观的。ANSI标准SQL中的典型方法是使用行号:


当然还有其他不需要显式联接的方法。

1用您正在使用的数据库标记您的问题。它不起作用。在几乎所有数据库中,它都会返回语法错误,因为ip不包括在GROUP BY中,所以SQL引擎不知道选择哪个值MySQL接受语法,但会插入不确定行中的值。常规GROUP BY规则说:如果指定GROUP BY子句,选择列表中的每个列引用必须标识分组列或是集合函数的参数。1使用正在使用的数据库标记问题。它不起作用。在几乎所有数据库中,它都会返回语法错误,因为ip不包括在GROUP BY中,所以SQL引擎不知道选择哪个值MySQL接受语法,但会插入不确定行中的值。常规GROUP BY规则说:如果指定GROUP BY子句,选择列表中的每个列引用必须标识分组列或是集合函数的参数。回答得好。我想补充一点,如果您知道用户名/ip对是唯一的,您可以使用简单的查询来查询GROUP BY username,ip。否则,您必须使用一种更复杂的方法来获得ip的正确值。回答得好。我想补充一点,如果您知道用户名/ip对是唯一的,您可以使用简单的查询来查询GROUP BY username,ip。否则,您必须使用更复杂的方法之一为ip获取正确的值。