2014-10-26 2 views
0

У меня есть таблица, как это в моем дб:запрос, чтобы получить количество раз, когда элемент появляется

id --- owner --- product ---- type 
0 --- john --- mustang ---- car 
1 --- tim --- a360 ---- plane 
2 --- john --- camry ---- car 
3 --- dan --- a380 ---- plane 
4 --- tim --- ninja ---- bike 
5 --- dan --- accord ---- car 

Я пытаюсь получить количество каждого типа владелец имеет. Что-то вроде этого:

John 
Car = 2 
Plane = 0 
Bike = 0 
------------- 
Tim 
Car = 0 
Plane = 1 
Bike = 1 
------------- 
Dan 
Car = 1 
Plane = 1 
Bike = 0 
------------- 

Мне не удалось это решить.

Другая проблема заключается в том, что моя база данных способна принимать новые типы. Например, кто-то может добавить велосипед как тип.

Есть ли способ сделать это?

+0

Я немного смущен, ОП. Принятый ответ не дает результата, который, как вы сказали, ожидался в вопросе. Что вы на самом деле ищете? – AdamMc331

ответ

0

Чтобы решить эту проблему, сначала вы должны генерировать выходные строки, а затем получить отсчеты:

select o.owner, p.product, count(t.owner) 
from (select distinct owner from table) o cross join 
    (select distinct product from table) p left join 
    table t 
    on t.owner = o.owner and t.product = p.product 
group by o.owner, p.product; 

Если у вас есть справочные таблицы для владельцев и продуктов, то вы можете использовать их вместо select distinct подзапросов ,

EDIT:

Группировка по типу в основном та же идея:

select o.owner, ty.type, count(t.owner) 
from (select distinct owner from table) o cross join 
    (select distinct type from table) ty left join 
    table t 
    on t.owner = o.owner and t.type = ty.type 
group by o.owner, ty.type; 
+0

Это не дает результат, который ищет ОП. – AdamMc331

+0

@ McAdam331. , , Во-первых, каким образом? Во-вторых, ОП принял ответ. –

+0

OP хотел, чтобы они были сгруппированы по типу, а не по продукту. Я не могу сказать, почему OP принял это, потому что он не согласуется с тем, что они просили, поэтому я не знаю, что действительно нужно OP. – AdamMc331

1

Так я подошел к этому было немного сложнее.

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

SELECT m.owner, t.type 
FROM myTypes t, myTable m 
GROUP BY m.owner, t.type 

Затем я сделал еще один набор результатов, захваченный владельца, тип и количество каждого типа для этого владельца. Однако это только возвращаемые строки для существующих комбинаций типа владельца. Он не вернет никаких значений, например, «Джон» и «Самолет», потому что у него нет плоского продукта.

SELECT m.owner, t.type, COUNT(*) as numOfType 
FROM myTypes t 
JOIN myTable m ON t.type = m.type 
GROUP BY t.type, m.owner; 

Наконец, я присоединился эти две таблицы вместе с помощью внешнего соединения, так что я получил все строки из таблицы комбинаций владелец типа. Конечно, некоторые строки вернули значение null для count, поэтому мне пришлось использовать IFNULL, чтобы заменить их на 0. Это соответствует набору результатов в вашем вопросе.

SELECT w1.owner, w1.type, IFNULL(w2.numOfType, 0) AS numOfType 
FROM (SELECT m.owner, t.type 
    FROM myTypes t, myTable m 
    GROUP BY m.owner, t.type) w1 
LEFT JOIN (SELECT m.owner, t.type, COUNT(*) as numOfType 
    FROM myTypes t 
    JOIN myTable m ON t.type = m.type 
    GROUP BY t.type, m.owner) w2 
ON w1.owner = w2.owner AND w1.type = w2.type; 

Адрес SQL Fiddle.

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