1

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

4

7 回答 7

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 子句的情况下运行查询以查看此连接的作用。您将所有者和所有者都放在一行中,然后您可以比较它们是否匹配。

于 2013-03-12T12:43:56.480 回答
2

您可以尝试类似的查询(不确定 MySQL 的反引号)

SELECT * FROM `table` 
  WHERE (`owner`,`owned`) 
  NOT IN (SELECT `owned`,`owner` FROM `table`);

没有selfjoins可能有更清洁的解决方案

于 2013-03-12T12:44:47.067 回答
1
select 
    * 
from 
    mytable 

where id not in (
    select
        m1.id
    from
        mytable m1,
        mytable m2

    where 
        m1.owner=m2.owned    
)   
于 2013-03-12T12:52:02.010 回答
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
            )
    );
于 2013-03-12T12:43:28.527 回答
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
于 2013-03-12T12:50:02.307 回答
1

您可以尝试以下演示:

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

于 2013-03-12T12:57:50.003 回答
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
于 2013-03-12T12:47:47.970 回答