我的MySQL数据库中有一个表,部分看起来像这样:
+----+-------+-------+
| id | owner | onwed |
+----+-------+-------+
| 1 | A | B |
| 2 | B | A |
| 3 | C | D |
| 4 | D | C |
| 5 | E | X |
+----+-------+-------+
这里的重要特征是所有条目都是成对的,因此每个“所有者”也与它们相关的记录“拥有”。 A“拥有”B,并且B“拥有”A.D“拥有”C,并且C“拥有”D。
但是,在第5行中,我们遇到了问题。 E“拥有”X,但没有X“拥有”E的条目。
我需要能够浏览这个包含数千条记录的表,并找到第5行的所有实例,其中我们有一个孤立的记录。没有与“所有者”和“拥有”字段相对应的相关的字段。此外,无法保证成对的行将在我的示例中相互跟随。
这个问题超出我的MySQL能力方式。当我知道我正在寻找的价值是什么时,我知道如何进行搜索。但我不知道如何逐个遍历每一行,取出值,然后使用这些值进行另一次搜索。我希望有人可以帮助我,我道歉,我对这件事情一无所知,我没有任何建议的代码。
我并不那么担心效率,因为这是一个检查我只会在有理由怀疑问题时不时地运行。此外,如果它有帮助,我从PHP脚本管理我的MySQL数据库,所以如果有可以利用PHP代码使任务更易于管理,那么也可以使用它。
答案 0 :(得分:3)
您需要的是join
。如果您将该表与自己拥有的所有者一起加入。
SELECT T1.Id, T1.Owner, T1.Owned, T2.Id, T2.Owner, T2.Owned
FROM tablename T1
LEFT JOIN tablename T2
ON T1.Owned = T2.Owner
WHERE T2.Owned != T1.Owner
OR T2.Id IS NULL
尝试在没有WHERE子句的情况下运行查询,以查看此连接的作用。您可以获得所有者并拥有一行,然后您可以比较它们是否匹配。
答案 1 :(得分:2)
您可以尝试类似的查询(不确定MySQL的反引号)
SELECT * FROM `table`
WHERE (`owner`,`owned`)
NOT IN (SELECT `owned`,`owner` FROM `table`);
可能没有自我加入的清洁解决方案
答案 2 :(得分:1)
有更好的方法,但这会奏效:
SELECT
*
FROM
table
WHERE
id NOT IN (
SELECT
id
FROM
table s1
WHERE
s1.owner = (
SELECT
onwed
FROM
table s2
WHERE
s2.onwed = s1.owner
)
);
答案 3 :(得分:1)
很容易:
select t1.id from tableName as t1 left join tableName as t2
on t1.owner = t2.owned and t1.owned = t2.owner
where t2.id is null
答案 4 :(得分:1)
select
*
from
mytable
where id not in (
select
m1.id
from
mytable m1,
mytable m2
where
m1.owner=m2.owned
)
答案 5 :(得分:1)
您可以尝试以下演示:
答案 6 :(得分:0)
SELECT a.id, a.owner, a.onwed
FROM TableName a
LEFT JOIN TableName b
ON (a.Owner = b.Owner AND a.Onwed = b.OnWed) OR
(a.Owner = b.OnWed AND a.Onwed = b.Owner)
GROUP BY a.id, a.owner, a.onwed
HAVING COUNT(*) = 1