0

我有一个包含 2 个要在查询中检索的 id 的表,并且我希望它们是不同的。但是我希望它们在列之间是不同的,所以:

| column1 | column2 |
|    2    |    3    | row1
|    2    |    4    | row2
|    3    |    2    | row3
|    3    |    2    | row3

应该返回第 1 行和第 2 行。有什么帮助吗?

编辑:

抱歉,这有点含糊,我在发帖时很着急。所以这两列都是引用同一个表的 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
4

2 回答 2

3

假设 column1 和 column2 都是数字数据类型,并且您正在比较 2 列,您可以使用以下

SELECT DISTINCT
    LEAST( column1 , column2 ) AS leastColumn,
    GREATEST( column1 , column2 ) AS greatestColumn
FROM yourTable

不过,我不完全确定您为什么要这样做,就好像两列存储相同的数据然后该表是 n:m 关系的一部分,因此可以进一步规范化。此外,随着数据集的增长,这将变得非常低效,但对于您的特定问题,这符合要求。

于 2013-06-12T23:58:57.097 回答
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
于 2013-06-13T05:17:46.033 回答