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 を「所有」していますが、E を「所有」している X のエントリはありません。

何千ものレコードがあるこのテーブルを調べて、孤立したレコードがある行 5 のようなすべてのインスタンスを見つける必要があります。「所有者」フィールドと「所有」フィールドが一致する反対のフィールドと相関関係がない場合。また、私の例のように、ペアになった行が互いに続くという保証はありません。

この問題は、MySQL の能力をはるかに超えています探している値が何であるかがわかっている場合、検索の方法を知っています。しかし、各行を 1 つずつ調べて値を取り出し、それらの値を使用して別の検索を行う方法がわかりません。誰かが私を助けてくれることを願っています。私はこの問題について無知であり、提案するコードがないことをお詫びします。

これは、問題が疑われる理由がある場合にのみ実行するチェックであるため、効率についてはそれほど心配していません。また、それが役立つ場合は、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`);

自己結合のないよりクリーンなソリューションがおそらくあります

于 2013-03-12T12:44:47.067 に答える
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

より良い方法がありますが、これはうまくいきます:

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 
    * 
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

以下のデモを試すことができます:

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 に答える