2013-09-06 5 views
0

У меня есть набор данных, который имеет список идентификаторов и с этими идентификаторами - это список категорий (поэтому каждый идентификатор может иметь много категорий). Я хочу найти список категорий и посмотреть, сколько разных идентификаторов находится внутри этой категории (число), но как только id подсчитывается в одной категории, он не будет учитываться в другом.Количество в последовательном порядке

Пример:

 
ID Category 
1 Gas Station 
1 Convenience Store 
1 Barber 
2 Day Care 
2 Gas station 
3 Convenience Store 
3 Golf Range 

Так что, если я делаю поиск подсчетов на АЗС и мини-маркете (в таком порядке) Автозаправочная станция получит кол-2 (для идентификатора 1 & 2), а затем Магазин удобств получит счет 1 (id 3).

В настоящее время мой запрос выглядит следующим образом:

select category,distinct(id) from TABLE 
where id in ('Gas Station','Convenience Store') 
group by category 

и это даст мне

 
Gas Station - 2 
Convenience Store - 2 

И это не то, что я хочу. Желаемый результат:

 
Gas Station - 2 
Convenience Store - 1 
+0

Во-первых, я предполагаю, что у вас есть ошибки SQL и хотел сказать "где категории в ..." вместо «где id in ...». Ваша личность группируется по категориям, поэтому вы получаете разные значения WITHIN, а не по всему набору результатов. – gwc

+0

* «как только идентификатор подсчитывается в одной категории, он не будет считаться в другом» * - каково правило для определения того, какая категория будет первой - обратный алфавитный порядок? Другими словами, почему нет магазина для удобства, считающегося 2 (идентификаторы 1 и 3), а заправочная станция подсчитана как 1 (идентификатор 2, идентификатор 1 не считается, поскольку он уже включен в магазин для покупок)? –

ответ

1

Это не очень понятно, почему вы хотите это выход, но технически вы можете производить его с помощью запроса

SELECT category, COUNT(DISTINCT id) count 
    FROM table1 
WHERE category = 'Gas Station' 
UNION ALL 
SELECT category, COUNT(DISTINCT id) count 
    FROM table1 
WHERE category = 'Convenience Store' 
    AND id NOT IN 
     (
     SELECT DISTINCT id 
      FROM table1 
      WHERE category = 'Gas Station' 
     ); 

Выход:

 
|   CATEGORY | COUNT | 
|-------------------|-------| 
|  Gas Station |  2 | 
| Convenience Store |  1 | 

Вот SQLFiddle демо

+1

@ user2755209 Помогло ли это? Вам нужна дополнительная помощь по вашему вопросу? – peterm

1

Обновлено

Попробуйте это как единый SQL:

SELECT Category 
,COUNT(*) 
,@ids:=CONCAT(@ids, ID, ',') 
FROM Table1, (SELECT @ids:=',') ids 
WHERE Category IN ('Gas Station','Convenience Store') 
AND POSITION(CONCAT(',', ID, ',') IN @ids) = 0 
GROUP BY Category 

SQLfiddle в http://sqlfiddle.com/#!2/2f026/12

Обновлено

Ok. попробуйте это: sqlfiddle

Модифицируйте @ peterm в (http://sqlfiddle.com/#!2/2f026/1) результаты:

CATEGORY    COUNT(*) @IDS:=CONCAT(@IDS, ID, ',') 
Convenience Store 1   ,1,3, 
Gas Station   2   ,1, 
+0

Это именно то, что мне нужно! Я играл с ним в скрипке, и это работает, но когда я переключу его на мой mysql, он не работает - какие-нибудь идеи почему? – user2755209

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