1

У меня есть таблица 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; 

Этого запрос по существу группы по идентификатору первым, чтобы удалить дубликаты идентификаторов и игнорировать раскол из-за различные категории. Затем он обменивает запрос на группировку по имени и типу трафика, объединяя тип трафика и количество имен вместе как «тип (счет)». Третьи группы только по имени и группе конкатцируют все типы, чтобы иметь столбец для имени, а затем второй столбец со всеми перечисленными числами + и запятыми. Мне просто интересно ... есть ли запрос, который мог бы сделать его быстрее, не имея необходимости использовать так много подзапросов и тому подобное? Благодарю.

+0

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

+0

"Быстрее"? Требуется ли больше нескольких миллисекунд? Сколько строк в таблице? –

ответ

0

Конечный результат: Я хочу, чтобы он отображал имена в одной строке вместе со всеми типами + count (где count - количество отдельных типов, как в одном типе отчета) в следующем ряд.

Используйте подзапрос как выражение в предложении SELECT и другое в предложении WHERE. Например:

SELECT B.Name, B.UserId AS [User Link], (SELECT Count(B2.Name) FROM Badges B2 WHERE B2.Name = B.Name) as [Total Gold, Silver, and Bronze Badges Awarded for this Tag] 
FROM Badges B 
WHERE Class = 2 
AND TagBased = 1 
AND (SELECT Count(B2.Name) 
    FROM Badges B2 
    WHERE B2.Name = B.Name 
    AND B2.Class = 2 
    AND B2.TagBased = 1) = 1 
GROUP BY B.Name, B.UserId 
ORDER BY B.Name 

Список литературы