2015-02-25 4 views
3

Я имею таблицу ниже, и я хочу сделать следующее:Как подсчитать количество сгруппированных строк в MySQL, когда я уже подсчитывать общее количество строк

  1. Подсчитайте количество раз каждый элемент появляется в таблица

  2. Подсчитайте DISTINCT количество элементов

  3. группирует элементы по имени

    +-------+---------+ 
    | id | names | 
    +-------+---------+ 
    | 1 | Apple | 
    | 2 | Orange | 
    | 3 | Grape | 
    | 4 | Apple | 
    | 5 | Apple | 
    | 6 | Orange | 
    | 7 | Apple | 
    | 8 | Grape | 
    +-------+---------+ 
    

    Для 1 и 3 точек у меня есть следующий запрос, который работает достаточно хорошо:

    SELECT * , 
        COUNT(names) as count_name, 
        FROM tbl_products WHERE type = '1' 
        GROUP BY names 
    

    Так я получаю:

    Apple (4) 
    Orange (2) 
    Grape (2) 
    

Теперь я хочу также подсчитать количество сгруппированы по строкам и добавлены строки для подсчета отдельных элементов, однако есть некоторая проблема, поскольку MySQL принимает запрос, но не может вывести результат:

SELECT * , 
    COUNT(names) as count_name, 
    COUNT(DISTINCT names) as count_total 
    FROM tbl_products WHERE type = '1' 
    GROUP BY names 

Может ли кто-нибудь посоветовать, в чем проблема?

EDIT: Для более клиренса я хочу, чтобы получить таблицу, как это:

+-------+---------+------------+-------------+ 
    | id | names | count_ctg | count_total | 
    +-------+---------+------------+-------------+ 
    | 1 | Apple |  4  |  3  | 
    | 2 | Orange |  2  |  3  | 
    | 3 | Grape |  2  |  3  | 
    +-------+---------+------------+-------------+ 
+0

Я не уверен, чего вы ожидаете. Не могли бы вы привести пример того, что вы ищете? –

+0

уверен, я хочу получить 1. Количество раз, когда каждый элемент появляется в таблице, то есть Apple - 4, Orange - 2, Grape - 2, затем я хочу получить 2. Сколько различных элементов существует в таблице, т. Е. 3 - у нас есть Apple, Orange и Grape, и, наконец, я хочу 3. группировать элементы по имени, т. е. получить 3 строки. – user3132858

+0

Я имею в виду, не могли бы вы изменить свой вопрос, чтобы показать результат запроса, который вы хотели бы иметь. –

ответ

0

1-.Count количество раз, каждый элемент появляется в таблице:

SELECT names, count(names) FROM tbl_products WHERE type = '1' group by names 

2-. Сколько отдельных позиций существует в таблице:

SELECT DISTINCT names FROM tbl_products WHERE type = '1' 

3-. Группа предметов по названию:

SELECT count(DISTINCT names) as Total FROM tbl_products WHERE type = '1' 

Как последнее изменение (ALL IN ONE):

SELECT id, names, count(names), total FROM tbl_products, (select count(distinct names) as total from tbl_products) as total WHERE type = '1' group by names 
+0

@ user3132858 у вас есть продвижение? –

0

Вы можете получить количество различающихся имен в подзапросе, то OUTER JOIN этой вещи обратно в ваш основной запрос, где вы уже решили для 1 и 3:

SELECT names , 
    COUNT(names) as count_name, 
    Total 
FROM tbl_products 
    OUTER JOIN (SELECT count(DISTINCT names) as Total FROM tbl_products) t2 
WHERE type = '1' 
GROUP BY names 
1

Почему бы не просто использовать запрос, который вы используете:

SELECT * , 
COUNT(names) as count_name, 
FROM tbl_products WHERE type = '1' 
GROUP BY names 

Этот запрос достигает всех трех целей.

1) Вы получаете счетчик числа каждого значения имени в count_name.

2) Число различных значений names будет равно количеству строк в результирующем наборе, поскольку вы группируете names. Практически любая клиентская база данных MySQL DB позволит вам получить это значение.

3) Вы встречаете ваш третий критерии группировки по названию по Явно используя GROUP BY names

Конечно, значение для id в наборе результатов не имеет смысла, вы можете выбрать только names и count_names.

+0

Привет, Майк, мой первоначальный вопрос: если я могу получить счет только через SQL в возвращаемом результате, но enayway, я, наконец, решил оставить запрос как есть, а затем я просто выполнил новый счет через php для результата запроса. – user3132858

0

Вы можете использовать SQL Windowing OVER()

Этот запрос возвращает функцию row_number() в качестве столбца идентификаторов в результатах, и за кадром (...) для row_number требует заказ по п. Вы можете заказать все, что захотите, но его больше всего заказывают.

;WITH vwGroups (name, Quantity) AS 
(
    SELECT name 
    ,  COUNT(*) 
    FROM tbl_products 
    GROUP BY name 
) 
SELECT ROW_NUMBER() OVER(ORDER BY Quantity DESC, name) AS id 
,  name 
,  Quantity AS count_name 
,  COUNT(*) OVER() AS count_total 
FROM vwGroups 
Смежные вопросы