2016-05-26 10 views
1

を評価私はこのような設定テーブルを持っている:のMySQL:別の列に基づいて列に一意の値を選択するには

id |  ip  | name  
--------------------------------- 
1  | 54.34.32.222 | John 
2  | 23.44.64.843 | Rick 
3  | 54.34.32.222 | John 
4  | 23.44.64.843 | John 
5  | 14.432.45.45 | Lisa 
6  | 54.34.32.222 | Lisa 
7  | 14.432.45.45 | Lisa 

私は名前だけごとに一意のIPを取得したいです。たとえば、「54.34.32.222」がJohnに対して2回表示されるため、最初の行を取得したいだけです。しかし、 "54.34.32.222"もリサに出てくるので、私もそのIPをつかみたい。

結果は次のようになります。

id |  ip  | name  
--------------------------------- 
1  | 54.34.32.222 | John 
2  | 23.44.64.843 | Rick 
4  | 23.44.64.843 | John 
5  | 14.432.45.45 | Lisa 
6  | 54.34.32.222 | Lisa 

どのように名前が表示される時間の量を数えるでしょうか?そうする際に、名前の中にipが何回出現するかを数えますが、その反対が必要です。 nameペア -

SELECT MIN(id), COUNT(name), ip, name FROM yourTable GROUP BY ip, name 

答えて

3

あなたが重複ipの場合に保持するレコードを決定する方法を述べたことはありません。ただし、サンプル出力に基づいて、最小のid値を持つレコードが保持されているようです。望ましい結果を得るためにグループ化しながら、この場合、私たちはMIN(id)を取ることができます:

SELECT MIN(id), ip, name 
FROM yourTable 
GROUP BY ip, name 

は、実行中のデモについては、以下のリンクをクリックしてください:あなたは以下のように使用することができ

SQLFiddle

+0

あなたは – jarlh

+0

.... 4秒で私を打ちます!名前の表示回数をどのように数えますか?そうする際に、名前の中にipが何回出現するかを数えますが、その反対が必要です。 FROM yourTable GROUP BY ip、名前 –

+0

はありがとうsqlfiddleあなたが私にも1例を倒す – steeped

0

query:任意の名前のIPアドレスの字句的な最小値を選択します。

SELECT NAME, MIN(IP) AS IP 
FROM TABLENAME 
GROUP BY NAME 

あなたが最初のレコードに対応するIPアドレスが必要な場合には(すなわち、最小のIDを持つレコードの1)その名前が見つかり:

SELECT NAME, IP 
FROM TABLENAME TN 
WHERE ID = (
    SELECT MIN(ID) 
    FROM TABLENAME TN1 
    WHERE TN1.IP = TN.IP 
    AND TN1.NAME = TN.NAME 
) 
+1

これは頼まれたものではありません。重複を取り除いて最初の一意のレコードを保持することが必要です。 – PaulF

+0

すでに指定された名前の中で最も低いIDを持つレコードを選択する2番目のオプションを追加していました。これは、ID値がレコード挿入の順序を反映していると仮定しています。 –

+0

2番目のオプションはまだ動作しません - それはIPアドレスの重複使用をフィルタリングしますが、OPはIPと名前の両方で重複を削除したいと考えています。 – PaulF

0

これはあなた

SELECT min(id),ip,name FROM youTable group by ip,name 
+0

Tim Biegeleisenの回答と同じ3分前です。 – jarlh

+0

それは偶然です –

+0

ちょっと、もう一度同じ答えを与えることは意味がないことに注意してください。 – jarlh

0

ためにあなたが動作するはずですおそらくあなたが望むものを得るためにここで派生テーブルとの結合を行う必要があります。副選択としてもできますが、ほとんどのユースケースではパフォーマンスが向上する可能性が高いため、結合ソリューションが表示されます。

SELECT 
    yourtable.id AS id, 
    ip, 
    name 
FROM yourtable 
/* join regular table to a derived table 
* where you have selected the first row id for each user 
*/ 
INNER JOIN (
    SELECT MIN(id) 
    FROM yourtable 
    GROUP BY name 
) AS min_id_per_name 
    ON yourtable.id = min_id_per_name.id 
ORDER BY yourtable.id 
関連する問題