2013-05-16 3 views
0

Я пытаюсь выполнить запрос 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 

Что я могу сделать, чтобы дать ему общие строки, а не группировать итоговые значения каждого идентификатора продукта как общего.

Пример того, что я получаю:

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. Необязательные накладные расходы в опции2 - это то, что Mysql фактически возвращает несколько строк в PHP, поэтому PHP может определить, сколько строк оно. В варианте 1 Mysql вернет только 1 строку со счетом. –

+0

Я понимаю, что вы имеете в виду; Я интерпретировал этот вопрос так, как он хотел, чтобы ОБОИХ отдельные строки * и * подсчитывали количество строк. Возможно, я неправильно понял. – TML

0

Nest все в подзапрос:

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

Use ROLLUP

GROUP BY p.products_id WITH ROLLUP; 

Редактировать: Я предполагаю, что вы используете MySQL. Другой СУБД имеет различный синтаксис:

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'. Попробуйте это ... –

Смежные вопросы