簡體   English   中英

MySQL:根據另一列值在列中選擇唯一值

[英]MySQL: Select unique value in column based on another columns value

我有一個這樣的表設置:

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”,所以我只想抓住第一行。 但是“54.34.32.222”也出現在Lisa身上,所以我也想抓住那個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在名稱中出現的次數,但我希望相反。

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

你從未提到過如何確定在重復的ip - name對的情況下要保留哪條記錄。 但是,根據您的示例輸出,您似乎保留了id值最小的記錄。 在這種情況下,我們可以在分組時獲取MIN(id)以獲得所需的結果:

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

請點擊以下鏈接查看正在運行的演示:

SQLFiddle

您可以使用以下查詢,該查詢為任何給定名稱選擇IP地址的詞法最小值:

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

如果您需要與為該名稱找到的第一條記錄對應的IP地址(即記錄中ID最低的記錄):

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

這應該適合你

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

您可能需要在此處對派生表進行連接以獲得所需內容。 你也可以做subselect,但我會顯示連接解決方​​案,因為大多數用例它可能會表現更好。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM