2014-07-18 3 views
0

У меня есть таблица MySQLКак выполнить два запроса COUNT (*) в одном запросе?

id | string 
------------------------------ 
1 | one, two, three 
2 | two, three, five 
3 | one, three, four 
4 | three, five 
5 | one, two, three 
6 | two, three, five 
7 | one, three, four 
8 | one, three, five 
9 | two, three, four, five 
10 | one, two, three, five 

и я хочу, чтобы принести соотношение количества элементов, которые содержат подстроку three в столбце string. Я мог бы легко выполнить два запроса и разделить их вручную:

SELECT COUNT(*) FROM `table` WHERE `string` LIKE '%three%' 

и разделить, что

SELECT COUNT(*) FROM `table` 

Но как я мог выполнить это только один запрос?

ответ

1

Вы можете использовать SUM с IF дает 1 или 0 в скобках: -

SELECT SUM(IF(`string` LIKE '%three%', 1, 0))/COUNT(*) 
FROM `table` 
+0

Да, это работает как шарм! –

0

Попробуйте это.

select sum(case when string like '%three%' then 1 else 0 end)/count(*) from table. 
+0

Не возвращает правильный результат (по сравнению с выполнением двух запросов и вручную разделяет один на другой). Этот запрос возвращает '0,0000'. –

+0

DISTINCT здесь не требуется – Kickstart

+0

Отредактировано моим ответом. Пожалуйста, проверьте его. –

0
select sum(find_in_set('three', replace(`string`, ' ', '')) > 0) * 100/count(*) as percentage 
from your_table 

Но вы должны рассмотреть вопрос об изменении вашего дизайна таблицы. Никогда, никогда, никогда не храните несколько значений в одном столбце!

+1

это не подходит для текущей формы данных поля '' string''. –

+0

Спасибо за подсказку. Теперь исправлено. –

+0

@juergend Спасибо за советы о дизайне плохих столов. Эта таблица представляет собой промежуточную таблицу OLAP, в которой выполняется процесс ETL. Я только хочу сделать некоторые предварительные вычисления. –

1

Выберите с, если условия, где, если условие истинно, то возвращение 1 другой мудрый 0. Здесь count(*) возврат всего количества или записи.

SELECT (SUM(IF(`string` LIKE '%three%', 1, 0)) * 100)/COUNT(*) 
FROM `table` 
+0

Что он возвращает и чего вы хотите? – Sadikhasan

+0

Извините, путайте некоторые ответы. Это возвращает правильный результат. –

+0

Да, я все еще сравниваю результаты (особенно время исполнения). –

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