如何选择具有相同内容但位于不同列的MySQL行?

时间:2011-08-20 07:12:37

标签: mysql

我有一个包含三列X,Y和Z

的MySQL表
|    X      |     Y     |      Z    |
-------------------------------------
|   john    |  patrick  |   active  |
|   john    |  miles    | inactive  |
|  patrick  |  john     |   active  |

我想选择行数据,给定'john'作为输入,对应于john-patrick对 - 也就是说,john和patrick都在X或Y中(比如TABLE中的select *行) X =约翰或Y =约翰,其中......)

有可能吗?如果是这样,怎么样?

6 个答案:

答案 0 :(得分:1)

如果我理解正确,则值必须在X Y中 (不包括样本中的元组('john','miles','inactive')。

然后你需要subquerys:

select X,Y,Z from TABLE where
  (X = 'john' or Y = 'john') and 
  X in (select Y from TABLE) and
  Y in (select X from TABLE);

编辑:第一个查询错误,多亏了ypercube(参见评论)。

更正版本:

select X,Y,Z from TABLE where
  (X = 'john' or Y = 'john') and 
  X in (select Y from TABLE as subTable WHERE
         TABLE.X = subTable.Y and TABLE.Y = subTable.X) and
  Y in (select X from TABLE as subTable WHERE
         TABLE.X = subTable.Y and TABLE.Y = subTable.X);

答案 1 :(得分:0)

select a, b, c from test where b  in (select distinct a from test) or a in (select distinct a from test)
john    patrick active
john    miles   inactive
patrick john    active

答案 2 :(得分:0)

有很多方法可以解决这个问题。这只是一个:

SELECT * 
FROM users
WHERE 
    (X = 'john' AND Y = 'patrick')
OR
    (Y = 'john' AND X = 'patrick');

答案 3 :(得分:0)

SELECT
    X, Y, Z 
FROM
    TABLE AS a
  JOIN
    TABLE AS b
      ON  b.X = a.Y
      AND b.Y = a.X
WHERE 
    (a.X = 'john' OR b.X = 'john')

答案 4 :(得分:0)

这是您表达为SQL的要求:

select a.X, a.Y, a.Z
from mytable a
join mytable b on a.X = b.Y and a.Y = b.X
where a.X = 'john';

这与ypercube的答案非常相似,但在一个小但非常重要的方面有所不同:在where子句中不需要or b.Y = 'john',因为这在逻辑上由on的{​​{1}}子句覆盖。加入(加入说a.X = b.Y,所以如果a.X = 'john'我们已经知道那个b.Y = 'john'

这种差异可能看起来很小,但在性能方面很大:当OR用于匹配索引列时,数据库将使用索引,即:

where col = 'x' or col = 'y' -- no: will not use index on col

where col = 'x'              -- yes: will use index on col

我的查询将在列X上使用索引(如果存在)。如果不存在,请创建一个。

顺便说一下,要让数据库在给定列的OR中使用索引,请改用IN。接下来的两行在逻辑上是相同的,但执行方式非常不同

where col = 'x' or col = 'y' -- no: will not use index on col

where col in ('x', 'y')      -- yes: will use index on col

答案 5 :(得分:-1)

您不需要为此加入。

select X,Y,Z from users where X like '%john%' or Y like '%john%';