У меня есть таблица MyTable
со значениями, которые выглядят следующим образом:SQL альтернатива двойной подзапрос
| id | name | type | category |
---------------------------------------------------
| 1 | Rob | Red | Rock |
| 2 | Rob | Blue | Rap |
| 2 | Rob | Blue | Rock |
| 3 | Jane | Green | Country |
| 3 | Jane | Green | Rap |
| 4 | Meg | Yellow | Rock |
| 5 | Jane | Blue | Rap |
| 5 | Jane | Blue | Rock |
| 6 | Jane | Red | Country |
| 6 | Jane | Red | Rock |
| 7 | Rob | Red | Rap |
| 7 | Rob | Red | Country |
| 8 | Meg | Green | Country |
| 9 | Meg | Blue | Rap |
Теперь моя проблема заключается в том, что (как данные приведены для меня), есть повторяющиеся идентификаторы , Каждый идентификатор означает отчет, поэтому идентификатор 1 для отчета 1. В этом отчете есть name
, type
и category
. В отчете может быть только один тип, но столько категорий, сколько ему нравится. Следовательно, дубликаты идентификаторов происходят из разных категорий, каждая из которых представляет собой новую строку. Конечный результат я хочу достичь, чтобы перечислять имена в одной строке вместе со всеми типами + count (где count - это счетчик различных типов, как в одном типе отчета) в следующей строке. Это будет выглядеть так:
| Rob | Red(2), Blue(1) |
| Jane | Green(1), Blue(1), Red(1) |
| Meg | Yellow(1), Green(1), Blue(1)|
Теперь я разработал запрос, который фактически использует два подзапроса и успешно достигает этого результата. Он идет
select name as firstCol, group_concat(type_counts order by countName desc separator ', ') as secondCol from
(select name, concat(type,' (',count(name),')') as type_counts, count(name) as countName from
(select name, type from
some join stuff
where (date_reported between '2014-11-01' and '2014-11-31')
group by id order by type, name) a
group by name, type order by name, count(name) desc) a
group by name;
Этого запрос по существу группы по идентификатору первым, чтобы удалить дубликаты идентификаторов и игнорировать раскол из-за различные категории. Затем он обменивает запрос на группировку по имени и типу трафика, объединяя тип трафика и количество имен вместе как «тип (счет)». Третьи группы только по имени и группе конкатцируют все типы, чтобы иметь столбец для имени, а затем второй столбец со всеми перечисленными числами + и запятыми. Мне просто интересно ... есть ли запрос, который мог бы сделать его быстрее, не имея необходимости использовать так много подзапросов и тому подобное? Благодарю.
Начните с самого внутреннего подзапроса - запустите его и убедитесь, что он сделал то, что вы хотите. Затем выйдите. –
"Быстрее"? Требуется ли больше нескольких миллисекунд? Сколько строк в таблице? –