У меня есть список тегов в базе данных.
Исключая:
villan
hero
spiderman
superman
superman
Я хотел получить отсортированный список имен тега в порядке возрастания и количества раз, уникальный тег появился в базе данных. Я написал этот код:
Исключая:
SELECT hashtag.tag_name
, COUNT( * ) AS number
FROM hashtag
GROUP BY hashtag.tag_name
ORDER BY hashtag.tag_name ASC
Это приводит к корректному результату:
hero , 1
spiderman , 1
superman , 2
villan , 1
Как я могу получить полное КОЛИЧЕСТВО этого всего списка. Ответ должен быть 4 в этом случае, потому что существует естественно 4 строки. Я, может казаться, не получаю корректное КОЛИЧЕСТВО () без сбоя оператора.
Большое спасибо за справку!:)
Используйте COUNT DISTINCT(hashtag.tag_name)
- он не может быть в том же SELECT
, что и у вас (кроме UNION
, конечно), но в SELECT
собственном (или соответствующем UNION
) он даст нужный вам результат.
Я не уверен насчет запроса в my-sql, но этот отлично работает с oracle.
SELECT hashtag.tag_name, count(*) FROM hashtag GROUP BY cube(hashtag.tag_name)
Чтобы сделать это именно так, как вы описываете (получить полный счет результирующего списка), вы должны взять счетчик результатов, например:
SELECT COUNT(*) AS uniquetags
FROM (SELECT hashtag.tag_name, COUNT( * ) AS number
FROM hashtag GROUP BY hashtag.tag_name
ORDER BY hashtag.tag_name ASC)
Конечно, предложение ORDER BY
является ненужным и поглощается внешним агрегатом COUNT
, как и внутренний COUNT
.
Кроме того, как отметили несколько человек, короткий путь к этому - COUNT DISTINCT
, как в:
SELECT COUNT(DISTINCT hashtag.tag_name)
FROM hashtag
Это может использовать или не использовать индексы более эффективно, в зависимости от того, понимает ли он, что ему не нужно считать все или нет. Если у кого-то больше знаний, пожалуйста, не стесняйтесь комментировать (или просто попробуйте сделать пару EXPLAIN
ов).