SQL Union只计算一个查询

时间:2012-07-11 17:21:25

标签: php sql database 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之前执行第一次查询,所以当我实际上应该计算1行时,我最终得到0。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:4)

另一种选择,用以下内容替换您的查询:

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

答案 1 :(得分: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
)";

答案 2 :(得分:1)

请改用UNION ALLUNION将排除重复的行。

答案 3 :(得分:1)

您可以使用更简单的解决方案:

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