2012-07-11 87 views
1

我試圖計算表中的行。目前即時通訊使用此:SQL Union只計算一個查詢

$sql = "SELECT COUNT(*) 
     FROM `friends` 
     WHERE `user1`='".$user1."' 
      AND `user2`='".$user2."' 
      AND `valid`=0 
     UNION 
     SELECT COUNT(*) 
     FROM `friends` 
     WHERE `user1`='".$user2."' 
      AND `user2`='".$user1."' 
      AND `valid`=0"; 

正如你看到的,user1既可以是$user1$user2。但它不會計算UNION之後的行,它只會在UNION之前執行第一個查詢,所以即時結束時爲0,當我實際上應該計數1行時。

我該如何解決這個問題?

回答

4

另一種選擇,這種替換查詢:

$sql = "SELECT COUNT(*) 
    FROM `friends` 
    WHERE (
      (`user1`='".$user1."' AND `user2`='".$user2."') OR 
      (`user1`='".$user2."' AND `user2`='".$user1."') 
     ) 
    AND `valid`=0"; 
+0

這個修好了!謝謝! :) – Kaizokupuffball 2012-07-11 17:26:37

+0

這取決於如果兩個查詢都返回一條記錄,OP是否需要'1'或'2'。如果前者,你的解決方案是理想的。如果是後者,不是那麼多 – Basic 2012-07-11 17:27:16

+0

@Basic它與您提供的解決方案相同... – Chandu 2012-07-11 17:31:05

1

改爲使用UNION ALLUNION將排除重複的行。

+0

好吧,但我已經試過了,沒有解決問題。 :P – Kaizokupuffball 2012-07-11 17:23:33

2

您的查詢實際上返回2個記錄 - 0爲第一計數和1第二。你可以使用一個子查詢到SUM()您的結果...

$sql = "SELECT SUM(A) AS COUNT FROM 
(SELECT COUNT(*) AS A 
     FROM `friends` 
     WHERE `user1`='".$user1."' 
      AND `user2`='".$user2."' 
      AND `valid`=0 
     UNION 
     SELECT COUNT(*) 
     FROM `friends` 
     WHERE `user1`='".$user2."' 
      AND `user2`='".$user1."' 
      AND `valid`=0 
)"; 
1

您可以使用一個更簡單的解決方案:

SELECT COUNT(*) 
FROM friends 
WHERE 
    $user1 IN (user1,user2) AND 
    $user2 IN (user1,user2) AND 
    valid = 0 
+0

這將允許$ user1和$ user2具有相同的值。 – shawnt00 2012-07-11 17:33:51

+0

@ shawnt00將輸入參數設置爲相同值是沒有意義的。如果你看起來很接近,對於每一行,$ user1都必須位於列的任一個*** ... ** AND ** $ user2 * ALSO *必須位於任一列中。單列不能包含兩個不同的用戶,所以它基本上是在兩個用戶都在'user1'和'user2'列的條件下進行檢索,但是以任何順序,這是OP想要的。 – 2012-07-11 17:40:22

+0

您的條件等同於:$ user1 ='user1'和$ user2 ='user1'或$ user1 ='user2'和$ user2 ='user2'或$ user1 ='user2'和$ user2 ='user1'或$ user1 ='user2'和$ user2 ='user2'。注意這與被接受的答案不一樣。 – shawnt00 2012-07-11 18:04:46