如何在MySQL数据库中查找与其他行无法正确关联的行

时间:2013-03-12 12:38:03

标签: php mysql

我的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代码使任务更易于管理,那么也可以使用它。

7 个答案:

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

您可以尝试以下演示:

http://sqlfiddle.com/#!2/0db47/7

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