2012-01-12 6 views
0

私はIPアドレスとユーザーIDのテーブルがあります。どのような与えられたことはユーザーIDですMySQLはこの状況をうまく表現できません

user_id | ip_address 
--------------------- 
1  | 127.0.0.1 
13  | 127.0.0.1 
27  | 192.168.0.1 
47  | 127.0.0.1 
59  | 192.168.0.1 
70  | 127.0.0.1 

、我々は1.私は何をしたいのですが私は、ユーザID 1.

とIPアドレスを共有するすべてのユーザーIDを選択していると言うでしょうこの状況を「私は知らない」よりもはっきりとした言葉のようなものを仮定していますが、わかりません。

サブクエリの使用を避けようとしています。

+0

サブクエリを避ける理由は何ですか? – pilcrow

+0

これは、より良い解決策が組み立てられるまで、かなり頻繁に実行されるものです。 – castis

+0

さて、サブクエリを避けるのはなぜですか?この場合、実際には、無関係なスカラー述語サブクエリ(「非量子化比較サブクエリ」)を使用した、明白で解読可能なソリューションが数回実行されます。そのサブクエリは他のどのように遅くても速いかもしれません...) – pilcrow

答えて

4
SELECT user_id FROM tablename 
WHERE ip_address in (
    SELECT ip_address FROM tablename where user_id=1 
); 

またはサブクエリなし:

SELECT righttable.user_id AS user_id 
FROM 
    tablename AS lefttable 
    INNER JOIN tablename AS righttable ON lefttable.ip_address=righttable.ip_address 
WHERE lefttable.user_id=1 
; 
+0

私はサブクエリを避けたいと私の質問で明確にしておくべきです、私は今編集します。 – castis

+0

私の答えが更新されました! –

+0

は魅力的な作品です、ありがとうございます。 – castis

1

私はあなたが(ユーザーごとに1つのレコードを想定して)欲しいと思う:

select user_id, ip_address 
from user_ips 
where 
    ip_address = (
    select ip_address from user_ips where user_id=1 
); 

更新これは、サブクエリよりも良いではありませんが、このようにすることもできます:

select matches.user_id 
from user_ips needle, user_ips matches 
where needle.user_id = 1 
and needle.ip_address = matches.ip_address 
+0

あなたの答えが同様に働きます。 Eugenは最初に引き分けた。とにかく助けてくれてありがとうございました – castis

+1

「回答が投稿されました」というポップアップが表示されたら、入力を終えました。少なくとも私たちは多種多様なシンタックスを持っていました。 :) –

関連する問題