我有一个包含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的理论查询应仅返回用户ID 3.我实际上并不关心我正在搜索的这些消息,只关注与他们相关联的用户,他们不是我正在搜索的用户,我想要一个具有唯一值的列表。
我尝试过类似的事情:
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
答案 0 :(得分:3)
假设column1和column2都是数字数据类型,并且您要比较2列,则可以使用以下
SELECT DISTINCT
LEAST( column1 , column2 ) AS leastColumn,
GREATEST( column1 , column2 ) AS greatestColumn
FROM yourTable
我不完全确定你为什么要这样做,好像两列存储相同的数据,然后这个表是n:m关系的一部分,所以这可以进一步规范化。此外,随着数据集的增长,这将变得非常低效,但对于您的具体问题,这符合要求。
答案 1 :(得分:0)
想出来。这是我最终使用的查询:
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