Как подсчитать количество сгруппированных строк в 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

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

РЕДАКТИРОВАТЬ: Для большего разрешения я хочу получить таблицу, как это:

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

3

Решение

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

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,

1

Другие решения

Вы можете получить количество отдельных имен в подзапросе, а затем НАРУЖНО присоединиться к этой вещи обратно в ваш основной запрос, который вы уже решили для 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
0

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

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'

Как ваше последнее редактирование (все в одном):

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

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

Этот запрос возвращает функцию row_number () в качестве столбца id в результатах, а over (…) для row_number требует предложения order by. Вы можете заказать все, что захотите, но это будет что-то заказано.

;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
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector