SQL在不同列之间有所区别

时间:2013-06-12 23:56:09

标签: mysql

我有一个包含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)。我希望这是足够的信息来帮助。

**

UPDATE:

**

这是我最终使用的查询:

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

2 个答案:

答案 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