Вилы в трёхэтажном SQL запрое

soulhunter

Новичок
Вилы в трёхэтажном SQL запрое

Помогите, пожалуйста, исправить SQL запрос, и просьба предложения типа "переставь это местами" не писать, прошу помогать только действительно знающих людей. Есть две таблицы с такой структурой:

1) images_category
-------------------------
category_id
category_name
category_category
category_order

2) images
--------------
img_id
img_size
img_category

В этих таблицах есть и другие поля, но для даннго запроса они не играют роли. Запрос:

PHP:
SELECT cat.*,
COUNT(cat2.category_id) AS category_categories,
SUM(img.img_size)+SUM(img2.img_size) AS category_size,
COUNT(img.img_id)+COUNT(img2.img_id) AS category_images
FROM images_category cat
LEFT JOIN images img ON (cat.category_id=img.img_category)
LEFT JOIN images_category cat2 ON (cat.category_id=cat2.category_category)
LEFT JOIN images img2 ON (cat2.category_id=img2.img_category)
WHERE cat.category_category=$MgId
GROUP BY cat.category_id ORDER BY cat.category_order ASC
Эти запросом я хочу выбрать размер и количество всех изображений, находящихся в данной категории (img.img_category=cat.category_id), количество всех подкатегорий, находящихся в данной категории (cat2.category_category=cat.category_id), и размер и количество всех изображений, находящихся в этих подгалереях (cat2.category_id=img2.img_id). Но при выполнении данного запроса результаты получаются во много раз больше, чем реально количество данных. Думаю это происходит из-за того, что выборка и сложение идут по cat.category_id и по cat2.category_id, а группироска только по cat.category_id. Помогите, пожалуйста найти решение и переделать этот запрос так как нужно.
 

chira

Новичок
попробуй:
Код:
SELECT cat.*
,COUNT(DISTINCT cat2.category_id) AS category_categories
,SUM(img.img_size) * COUNT(DISTINCT img.img_id)/IF(COUNT(img.img_id)=0,1,COUNT(img.img_id))
+SUM(img2.img_size) AS category_size,
COUNT(DISTINCT img.img_id)+COUNT(img2.img_id) AS category_images
FROM images_category cat
LEFT JOIN images img ON (cat.category_id=img.img_category)
LEFT JOIN images_category cat2 ON (cat.category_id=cat2.category_category)
LEFT JOIN images img2 ON (cat2.category_id=img2.img_category)
WHERE cat.category_category=$MgId
GROUP BY cat.category_id ORDER BY cat.category_order ASC
 

soulhunter

Новичок
Стало лучше, но всё равно не до конца ( с твоим запросом было ближе к истине, но всё равно неправильно). Я немного модифицировал твой запрос и теперь когда в категории есть подкатегории и изображения в них, то всё выводится правильно, а если в подкатегориях нет изображений (img2 пустая), nо и img тоже становится пустой, хотя в ней есть значения, тоесть он выводит размер 0.
Вот новый код:

PHP:
SELECT cat.*,
COUNT(DISTINCT cat2.category_id) AS category_categories,
SUM(img.img_size)*COUNT(DISTINCT img.img_id)/IF(COUNT(DISTINCT img.img_id)=0,1,COUNT(img.img_id))+
SUM(img2.img_size)*COUNT(DISTINCT img2.img_id)/IF(COUNT(DISTINCT img2.img_id)=0,1,COUNT(img2.img_id)) AS category_size,
COUNT(DISTINCT img.img_id)+COUNT(DISTINCT img2.img_id) AS category_images
FROM images_category cat
LEFT JOIN images img ON (cat.category_id=img.img_category)
LEFT JOIN images_category cat2 ON (cat.category_id=cat2.category_category)
LEFT JOIN images img2 ON (cat2.category_id=img2.img_category)
WHERE cat.category_category=$MgId
GROUP BY cat.category_id ORDER BY cat.category_order ASC
Осталось только решить проблему с тем, то я написал выше.
 

chira

Новичок
попробуй добавить IFNULL
Код:
SELECT cat.*,
COUNT(DISTINCT cat2.category_id) AS category_categories,
SUM(img.img_size)*COUNT(DISTINCT img.img_id)/IF(COUNT(DISTINCT img.img_id)=0,1,COUNT(img.img_id))+
IFNULL(SUM(img2.img_size)*COUNT(DISTINCT img2.img_id)/IF(COUNT(DISTINCT img2.img_id)=0,1,COUNT(img2.img_id)),0) AS category_size,
COUNT(DISTINCT img.img_id)+COUNT(DISTINCT img2.img_id) AS category_images
FROM images_category cat
LEFT JOIN images img ON (cat.category_id=img.img_category)
LEFT JOIN images_category cat2 ON (cat.category_id=cat2.category_category)
LEFT JOIN images img2 ON (cat2.category_id=img2.img_category)
WHERE cat.category_category=$MgId
GROUP BY cat.category_id ORDER BY cat.category_order ASC
 

soulhunter

Новичок
Спасибо большое )))
Всё заработало.
Правда пришлось добавить проверку на пустое значение и для таблицы img, но это так, к сведению.
В общем большое тебе спасибо!

-~{}~ 20.02.06 16:16:

а, ещё вопросик )
если размер равен нулю, то выводится 0.00, это из-за деления. Это можно как-нибудь убрать?
 
Сверху