我有一个包含三列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 =约翰,其中......)
有可能吗?如果是这样,怎么样?
答案 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%';