2012-01-12 4 views
0

У меня есть это активы таблицы:
Mysql Условный граф

asset_id  | mediumint(8) 
asset_type_id | mediumint(8) 
asset_name | varchar(200) 

и таблицу поиска:

product_id | mediumint(8) 
asset_id | mediumint(8) 
sequence | smallint(3) 

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

Активы классифицируются как изображение, видео, звук и т. Д. На основе его объекта asset_type_id. Этот объект asset_type_id содержит целые числа от 1 до 16.

Теперь я хочу подсчитать количество изображений (1), видео (2) и звук (3) ТОЛЬКО для определенного элемента. В любом случае, я могу сделать это, используя один SELECT QUERY?

Я не могу ограничить свой выбор только значением asset_type_id = 1 или 2 или 3, потому что мне все еще нужны данные других активов.

+0

да. Как вы хотите выход? – gbn

+0

Я хочу, чтобы это как product_id | asset_count_image | asset_count_video | asset_count_sound –

ответ

5
SELECT 
    l.product_id, t.asset_type_id, COUNT(*) 
FROM 
    lookup l 
    CROSS JOIN 
    (SELECT 1 AS asset_type_id UNION ALL SELECT 2 UNION ALL SELECT 3) t 
    LEFT JOIN 
    assets a ON l.asset_id = a.asset_id AND t.asset_type_id = a.asset_type_id 
GROUP BY 
    l.product_id, t.asset_type_id; 

Edit: в отдельных колонках

SELECT 
    l.product_id, 
    COUNT(CASE WHEN a.asset_type_id = 1 THEN 1 END) AS asset_count_image, 
    COUNT(CASE WHEN a.asset_type_id = 2 THEN 1 END) AS asset_count_video, 
    COUNT(CASE WHEN a.asset_type_id = 3 THEN 1 END) AS asset_count_sound 
FROM 
    lookup l 
    LEFT JOIN 
    assets a1 ON l.asset_id = a.asset_id AND a.asset_type_id IN (1, 2, 3) 
GROUP BY 
    l.product_id; 
+0

HI gbn, извините, я забыл включить. Я не могу использовать идентификатор group by asset, потому что результат должен быть сгруппирован по product_id. –

+0

@ Jan-DeanFajardo: Я изменил это после вашего комментария – gbn

+0

Wow. Это то, что я ищу. Благодаря! –