0

我有这个查询:

SELECT *
  FROM iptable
 WHERE ip = (SELECT ip
               FROM iptable
              WHERE name = 'username'
              ORDER BY date DESC
              LIMIT 0,1
            )
   AND name != 'username'

这是它的作用:

  • 用户输入一个名称(在本例中为username
  • 查询从iptable获取最新记录(仅限 IP)
  • 它使用返回的 IP 在iptable中搜索其他用户

该查询运行良好,但我想知道是否可以使其使用 JOIN 而不是子查询?任何帮助将不胜感激。

4

1 回答 1

0

您正在从给定用户的最新 ip 中选择 ip 上出现的所有名称。(我最初误读了查询,所以这会有所帮助。)

以下将其转换为显式连接:

select ip.*
from iptable ip join
     (select date, max(ip) as maxip
      from iptable
      where name = 'username'
      group by date
      order by date desc
      limit 1
     ) ips
     on ips.maxip = ip.ip
where is.name <>  'username'

(可能会假设名称和 ips 永远不会为 NULL。)

不过,我确实想指出,原始版本仍在进行连接,只是没有明确说明。

挑战是获取最近的 ip 作为名称。这是另一种方式,使用group_concatwith substring_index

select ip.*
from iptable ip join
     (select name,
             substring_index(group_concat(ip order by date desc), ',', 1) as lastip
      from iptable
      where name = 'username'
      group by name
     ) ips
     on ips.lastip = ip.ip
where ips.name <> ip.name
于 2013-01-18T00:50:46.340 回答