0

私はこのクエリを持っています:

SELECT id,id1,title FROM tablename 
    LEFT JOIN tablename AS parent 
        ON tablename .id1 = parent.id 
        WHERE parent.id is NULL 

私が達成しようとしているのは、親が存在しない行のみが表示されることです。

テーブルのレイアウトと内容

id    id1(parent)    title
1     0              parent
2     1              child1
3     1              child2
4     100            orphan
5     1              child3
6     1              child4

この例では、既存の親行を持たない行 (行 4、孤立、テーブル名に存在しない親 100) を除いてすべてを照会します。

4

4 に答える 4

1

私が達成しようとしているのは、親が存在しない行のみが表示されることです。

確かに、これは次の正反対です。

Mysqlは既存の親を持つ行のみを選択します

あなたの質問のクエリは、あなたの要件を正確に満たしているようですonly rows are shown from which no parent exist

これの反対が必要な場合は、内部結合を使用して where 句を失います。

SELECT id,id1,name FROM table 
INNER JOIN table AS parent 
    ON table.id1 = parent.id; 
于 2013-09-13T11:34:28.363 に答える
1

これ

SELECT child.id,child.id1,child.name 
FROM table AS child --alias names, as column names would be ambiguous
LEFT JOIN table AS parent 
    ON table.id1 = parent.id 
WHERE parent.id is NULL  -- only no parent!

孤児を表示します。すべての非孤児を取得するには

SELECT child.id,child.id1,child.name 
FROM table AS child
JOIN table AS parent -- JOIN takes care of getting only the records with parents 
    ON child.id1 = parent.id 

なぜこれがこのように機能するのですか?LEFT JOINテーブルを結合するためのもので、左側のテーブルの行を受け取りたいのですが、右側のテーブルには結合基準を満たすレコードがありません。右側の表に関連する列はすべてNULLその場合です。単純な を使用するJOINと、最初のテーブルから、結合の右側のテーブルにレコードがある行のみが表示されます。

なぜ間違った結果になったのか

テーブルを結合するとき、列名があいまいになる可能性があり、自己結合するときは常にそうです...エイリアス名を使用して、それらを区別する必要があります。

考慮すべきアイデア

保守性。たとえ例であっても、これを念頭に置いてください。オブジェクトに適切な名前を付けます:table説明的な名前ではありません (キーワードでもあります) PERSON。代わりに使用してください。列の場合id1、説明的な名前ではありません -PARENT_ID代わりに使用してください...

于 2013-09-13T11:30:35.553 に答える
1

の列のテーブル エイリアスが必要であることを除いて、クエリは正しいように見えますselect

SELECT table.id, table.id1, table.name
FROM table LEFT JOIN
     table AS parent 
     ON table.id1 = parent.id 
WHERE parent.id is NULL ;

問題は、 と の両方tableparent同じ列があることです。エンジンは、テーブル エイリアスがないと、本当に必要なものを認識できません。

于 2013-09-13T11:31:05.193 に答える
0

次のクエリを試してください。

SELECT id,id1,title
FROM table 
WHERE id1 IS NULL OR id1 NOT IN(SELECT id FROM table);
于 2013-09-13T11:36:46.107 に答える