2012-03-09 11 views
0

MySQLデータベースの同じ行に2つのクエリ(たとえば、更新文と削除文)が影響するかどうかをチェックする必要があります。2つのクエリが同じ行に影響するかどうかを比較するにはどうすればよいですか?

私が選択したクエリの影響を受けた項目を選択することについて考えと同じ行が両方のクエリーに表示されているかどうかを確認:実際には

UPDATE Foo SET col = 'a' WHERE id > 5; 
DELETE FROM Foo WHERE col = 'b'; 

SELECT (SELECT * FROM Foo WHERE col = 'b') IN (SELECT * FROM Foo WHERE id > 5); 

それは私の簡単なFooテーブルのために働いたが、別のテーブルに失敗しましたいくつかの列で - 2つのサブ選択が正確に同じ場所を選択した場合でも。また、このソリューションでは、最初のサブ選択には1つの結果しか含めることができません。

上記の選択が別のテーブルで失敗する可能性がある別のソリューションまたは理由を知っている人はいますか?

+0

'IN(...)句に副選択を使用すると、副選択は値の単一の列のみを戻す必要があります。 SQLは、複数の列が戻されたときに、IN項目に対して比較したいWHICH項目を認識しません。 –

答えて

0

私はMySQLでのみ解決するのではなく、PHPで私の問題を部分的に解決しました。

私は関連するクエリの影響を受けたエントリを選択し、私のアプリケーションで結果を比較します(私の場合はPHPで実現しています)。

MySQLで1つのクエリで解決できないのはなぜですか? 現時点では、私はクエリを比較する必要があった、私はクエリによって与えられた何かを知らない。私はどのテーブルが影響を受けているのかわかっていますが、どのテーブルがどのように構造化されているのか、またどのカラムがプライマリ・キーであるのか(あるいは複数のプライマリ・キーがある場合でも)だから私は多かれ少なかれ、PHPで自分自身のIN関数を書いたのです。

解決策の別の方法は、MySQLから主キーを取得すること(例:DESCRIBEを使用)と、記載されたヨアヒム・イザクソンのソリューションを使用することです。

これをあなたと共有したかっただけです。

0

両方の影響を受ける行を取得するには、WHERE条件のみが必要です。

SELECT * FROM Foo WHERE (col='b') AND (id>5); 

INは、設計上、1つの列の結果のみで動作します。

+0

しかし、何が制限を含んでいる削除ステートメントと、おそらくオーダーを比較したいのですか?私の問題は、どのクエリを比較するのかわからないため、すべてのケースをカバーする必要があります。 – Zwie

+0

テーブルにプライマリキーがある場合は、その例として 'id'を挙げましょう。 IN 'クエリを使用して、 'SELECT * Foo WHERE id IN(SELECT id FROM Foo WHERE col = 'b')AND id IN(SELECT id FROM Foo WHERE id> 5);' –

関連する問題