![](/img/trans.png)
[英]SQL: Less invasive way to find difference between two distinct columns
[英]SQL distinct between different columns
我有一個表,其中包含要在查詢中檢索的2個ID,並且希望它們與眾不同。 但是我希望它們在列之間是不同的,所以:
| column1 | column2 |
| 2 | 3 | row1
| 2 | 4 | row2
| 3 | 2 | row3
| 3 | 2 | row3
應該返回row1和row2。 有什么幫助嗎?
抱歉,這有點含糊,發布時我很着急。 因此,這兩列都是引用同一表的ID。 讓我們將其視為用戶之間的消息,其中所討論的表是消息,而ID是用戶ID(一個用於發送者,一個用於接收者)。 所以消息表看起來像這樣:
| sender_id | receiver_id |
| 2 | 3 | message1
| 2 | 3 | message2
| 3 | 2 | message3
每個用戶可以根據需要發送任意其他消息,因此每個用戶之間可以有很多消息。 我想知道給定用戶向哪些用戶發送了消息。 因此,我需要查詢以查找ID為2的用戶已發消息的用戶。 因此,在給定用戶ID 2的情況下,此理論查詢應僅返回用戶ID3。我實際上並不關心正在搜索的這些消息,僅關心與之關聯的用戶,而不是我要搜索的用戶,我想要一個具有唯一值的列表。
我已經嘗試過類似的東西:
SELECT sender_id, receiver_id FROM messages
WHERE sender_id = 2 OR receiver_id = 2
GROUP BY sender_id
GROUP BY receiver_id
和
SELECT DISTINCT sender_id, receiver_id FROM messages
WHERE sender_id = 2 OR receiver_id = 2
但是這些只會返回其中一個ID的唯一列表。 (即,它將兩次返回用戶ID 3)。 我希望這是足夠的信息來提供幫助。
**
**
這是我最終使用的查詢:
SELECT DISTINCT other_user_id FROM (
SELECT sender_id AS some_user_id,
receiver_id AS other_user_id FROM messages
UNION
SELECT receiver_id AS some_user_id,
sender_id AS other_user_id FROM messages
)
WHERE some_user_id = whatever_value
假設column1和column2都是數字數據類型,並且您要比較2列,則可以使用以下內容
SELECT DISTINCT
LEAST( column1 , column2 ) AS leastColumn,
GREATEST( column1 , column2 ) AS greatestColumn
FROM yourTable
我不太確定為什么要這樣做,就像兩列存儲相同的數據一樣,那么此表是n:m關系的一部分,因此可以進一步規范化。 另外,隨着數據集的增長,這將變得非常低效,但是對於您的特定問題,這是合理的。
弄清楚了。 這是我最終使用的查詢:
SELECT DISTINCT other_user_id FROM (
SELECT sender_id AS some_user_id,
receiver_id AS other_user_id FROM messages
UNION
SELECT receiver_id AS some_user_id,
sender_id AS other_user_id FROM messages
)
WHERE some_user_id = whatever_value
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.