SQLの式は、1行の列のみを参照する必要があります(サブクエリを除く)。
JOIN
2つの異なる行を結果セットの1つの行にするために使用できます。
したがって、自己結合を実行することにより、異なる行の値を比較できます。これは、各行を同じクライアントに関連付けられている他のすべての行に結合することを示す例です(行のそれ自体への結合を除く):
SELECT c1.*, c2.*
FROM client c1
JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id)
これで、列を比較する式を記述できます。たとえば、上記のクエリをfield1が異なるクエリに制限するには:
SELECT c1.*, c2.*
FROM client c1
JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id)
WHERE c1.field1 <> c2.field1;
必要な比較の種類は指定しないので、お任せします。重要な点は、一般に、自己結合を使用して特定のテーブルの行を比較できることです。
コメントと説明を再確認してください。わかりました。つまり、「違い」は単に値ではなく、行の序数によるものです。リレーショナルデータベースには行番号の概念がなく、ORDER BY
で指定する必要のある順序に関する行の順序しかないことに注意してください。 句。 「id
」と混同しないでください 「行番号付きの疑似キー。番号は、実装の一致によってのみ単調に増加するように割り当てられます。
SET @clientid = -1, @field1 = '';
SELECT id, clientId, field1, @clientid, @field1,
IF(@clientid <> clientid,
((@clientid := clientid) AND (@field1 := field1)) = NULL,
IF (@field1 <> field1,
(@field1 := field1),
NULL
)
) AS field1_changed
FROM client c
ORDER BY clientId, id;
このソリューションは、プレーンSQLですべての行を選択し、行をフェッチするときにアプリケーション変数で値を追跡することと実際には違いがないことに注意してください。