2015-12-12 3 views
0

вот моя структура данных:сложно MySQL запросов с категориями

category_main 
id name 
--------------------- 
1 catmain1 
2 catmain2 

category_sub 
id name  id_catmain 
--------------------- 
1 catsub1 1 
2 catsub2 1 
3 catsub3 2 

images 
id name  catsub 
--------------------- 
1 image1 1 
2 image2 1 
3 image3 2 
4 image4 3 

желаемый результат:

id_catmain catmain images_total 
-------------------------------------------------- 
1   catmain1 3 
2   catmain2 1 

проблема получает общее количество изображений в основной категории .. я пытался что-то вроде (в виде)

select categories.*, group_concat(id) as all_cat from categories group by id_catmain 

затем запрашивает этот вид с помощью FIND_IN_SET .., но я думаю, что лучше всего использовать только один запрос. есть идеи? благодаря

ответ

2

Что-то вдоль этих линий должны работать, я думаю:

SELECT c.id, c.name, COUNT(*) AS images_total FROM images i 
JOIN category_sub cs ON cs.id = i.catsub 
JOIN category_main c ON c.id = cs.id_catmain 
GROUP BY c.id 

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

1

Вы можете решить это разными способами. Один из них будет использовать подзапрос:

SELECT c.id AS id_catmain, c.name AS catmain, 
    (SELECT COUNT(i.id) AS totalImages 
    FROM images i 
    INNER JOIN category_sub s ON i.catsub = s.id 
    WHERE s.id_catmain = c.id) as totalImages 
FROM category_main c 
ORDER BY c.name ASC; 

Пример здесь: http://sqlfiddle.com/#!9/d78e2/5

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

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