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'

(names と 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 に答える