2013-05-16 63 views
0

我正在尝试做一个需要group by的count查询。但是当我得到我的结果时,我得到了正确数量的行,但他们的总数列中的计数,而不是我想要的行数量。用组数来计算,返回行数

SELECT Count(p.products_id) AS total 
FROM products p 
     LEFT JOIN specials s 
       ON p.products_id = s.products_id 
     LEFT JOIN manufacturers m 
       ON p.manufacturers_id = m.manufacturers_id 
     JOIN products_description pd 
     ON p.products_id = pd.products_id 
     JOIN products_to_categories p2c 
     ON p.products_id = p2c.products_id 
     INNER JOIN products_specifications ps7 
       ON p.products_id = ps7.products_id 
     LEFT JOIN products_to_icon p2i 
       ON p.products_id = p2i.products_id 
     LEFT JOIN products_icons pi 
       ON p2i.icons_id = pi.icons_id 
WHERE p.products_status = '1' 
     AND pd.language_id = '1' 
     AND ps7.specification IN ('Polycotton') 
     AND ps7.specifications_id = '7' 
     AND ps7.language_id = '1' 
GROUP BY p.products_id 

我能做些什么来使它给我总行数,而不是将每个产品ID的总数分组为总数。

什么样我得到的:

total 
1 
2 
1 
1 
2 
2 

我想要什么:

total 
6 
+0

当前计数是否可以包含0?如果是这样,总数应该包括那一行吗? –

回答

0

选项1:

Count(t.products_id) AS total FROM (
    SELECT p.products_id 
    FROM products p 
      LEFT JOIN specials s 
        ON p.products_id = s.products_id 
      LEFT JOIN manufacturers m 
        ON p.manufacturers_id = m.manufacturers_id 
      JOIN products_description pd 
      ON p.products_id = pd.products_id 
      JOIN products_to_categories p2c 
      ON p.products_id = p2c.products_id 
      INNER JOIN products_specifications ps7 
        ON p.products_id = ps7.products_id 
      LEFT JOIN products_to_icon p2i 
        ON p.products_id = p2i.products_id 
      LEFT JOIN products_icons pi 
        ON p2i.icons_id = pi.icons_id 
    WHERE p.products_status = '1' 
      AND pd.language_id = '1' 
      AND ps7.specification IN ('Polycotton') 
      AND ps7.specifications_id = '7' 
      AND ps7.language_id = '1' 
    GROUP BY p.products_id 
)t 

这将包括行,首先将返回一个0 ...

如果你不希望出现这种情况,然后添加下GROUP BY线这条线:

HAVING count(p.products_id) > 0 

选项2: 只需使用php函数mysql_num_rows(),mysqli_num_rows()或PDO等效项,具体取决于您使用的是哪一组mysql函数。 (不建议使用此选项,因为它对于服务器而言是不必要的开销。)

+0

你说的这个“不必要的开销”是什么? – TML

+0

@TML option2中不必要的开销是Mysql实际上将多行返回给PHP,因此PHP可以确定它有多少行。在选项1中,Mysql将只返回1行并且其中包含计数。 –

+0

我明白你的意思了;我把这个问题解释为他想要的是单独的行和*行数。也许我误解了。 – TML

0

巢一切都在一个子查询:

SELECT COUNT(*) FROM (
     [your query here] 
) AS subquery 
0

Use ROLLUP

GROUP BY p.products_id WITH ROLLUP; 

编辑:我假设你正在使用MySQL。其他DBMS有不同的语法:

GROUP BY p.products_id, rollup(p.SOME_COLUMN); 
+0

这给了我这个:http://i.imgur.com/1oTOFUF.png – Sackling

+0

它将永远是最后的结果,在你的情况下,9 ...可以肯定,你应该选择另一列'SELECT p.products_id ,COUNT(p.products_id)'。然后列p.products_id将为NULL。试试吧...... –