2012-03-09 39 views
0

我必須檢查兩個查詢(例如更新和刪除語句)是否影響MySQL數據庫中的同一行。如何比較兩個查詢是否影響同一行?

我想到了一個選擇選擇查詢受影響的條目,並檢查是否在同一行出現在兩個查詢:

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表,但在另一個表故障與幾列 - 即使當兩個子選擇完全相同。同樣對於這個解決方案,第一個子選擇只能包含一個結果。

有誰知道另一個解決方案或上述選擇可能會失敗與另一個表的原因?

+0

對子句IN'(...)'子句的使用要求子查詢只返回一列值。當多個列被返回時,SQL不會知道你想要比較的WHI字段。 – 2012-03-09 15:23:54

回答

0

我現在用PHP解決了我的部分問題,而不是隻用MySQL來解決問題。

我選擇相關查詢的受影響條目,並將結果與​​我的應用程序進行比較(在我的情況下,它是用PHP實現的)。

爲什麼我不通過對MySQL的一個查詢來解決它? 現在我必須比較查詢,我不知道查詢給出的任何其他內容。我仍然知道哪些表受到影響以及哪些列,但我不知道這些表是如何構建的或哪些列是主鍵(或者甚至有多個主鍵)。這就是爲什麼我或多或少地在PHP中編寫我自己的IN函數。

解決方案的另一種方法是從MySQL獲取主鍵(例如使用DESCRIBE)並使用Joachim Isaksson描述的解決方案。

只是想與你分享。

0

要獲得將受到影響的行只需要WHERE條件,只需做;

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

IN只適用於設計的單列結果,抱歉。

+0

但是,當我想比較包含限制和可能還包括訂單的刪除語句時,是什麼情況?我的問題是,我不知道我會比較哪些查詢,所以我必須涵蓋所有情況... – Zwie 2012-03-09 15:30:36

+0

如果您的表具有主鍵,我們假設它是'id'作爲示例,您可以執行「 IN'使用該查詢; SELECT * FROM Foo WHERE id IN(SELECT id FROM Foo WHERE col ='b')AND ID IN(SELECT id FROM Foo WHERE id> 5);' – 2012-03-09 15:38:06

相關問題