2013-03-05 3 views
0

Я пытаюсь получить список категорий с количеством имеющихся в нем дочерних записей. Если в категориях нет записей, он должен возвращать NULL или 0, но мой запрос, возвращающий категории с дочерними записями, выглядит так, как если бы он пропускал тот, у которого нет дочерних записей. ... будет очень благодарна за помощь.mysql left join not return empty row

вот мой код:

SELECT 
t_gal.f_sub_category_id, 
t_sub_cat.f_sub_cat_name, 
t_gal.f_image_thumb, (
    SELECT COUNT(*) 
    FROM t_gallery 
    WHERE f_sub_category_id = t_gal.f_sub_category_id) 
    AS f_image_total 
FROM t_gallery t_gal 
LEFT JOIN t_sub_category t_sub_cat ON t_sub_cat.r_id = t_gal.f_sub_category_id 
GROUP BY t_sub_cat.r_id 
ORDER BY t_gal.f_added_on DESC, t_gal.r_id DESC 

Вот две таблицы:

enter image description here

enter image description here

+0

Вы можете проверить: 'ВЫБРАТЬ tg.f_sub_category_id, tsc.f_sub_cat_name, tg.f_image_thumb, COUNT (*) FROM f_image_total t_gallery Т.Г. LEFT JOIN t_sub_category tsc ON tsc.r_id = tg.f_sub_category_id GROUP BY tg.f_sub_category_id, tg.r_id ORDER BY tsc.f_added_on DESC, tg.r_id DESC; '? – SparKot

ответ

0

Проблема, как представляется, ваша группа по п.

Вы группируете поле, находящееся в таблице LEFT JOINed, поэтому, когда группа делает все строки, которые не имеют соответствующей строки в этой таблице, будут объединены в одну строку.

Я думаю, что вы пытаетесь получить список предметов галереи, а также категорию, в которой они находятся (если найдено), и количество других галерей в той же категории. Если это так, попробуйте следующее (если не дайте мне знать!)

SELECT t_gal.f_sub_category_id, t_sub_cat.f_sub_cat_name, t_gal.f_image_thumb, Sub1.GalleryCount 
FROM t_gallery t_gal 
LEFT JOIN t_sub_category t_sub_cat 
ON t_sub_cat.r_id = t_gal.f_sub_category_id 
LEFT OUTER JOIN (SELECT f_sub_category_id, COUNT(*) AS GalleryCount FROM t_gallery GROUP BY f_sub_category_id) Sub1 
ON Sub1.f_sub_category_id = t_gal.f_sub_category_id 
ORDER BY t_gal.f_added_on DESC, t_gal.r_id DESC 
0

Похоже, для каждого суб-категории (из ранее выбранной категории), вы хотите, чтобы включить все это подкатегорию ... И , из этих подкатегорий вы хотите подсчитать количество изображений для этой категории или нет даже изображения в таблице галереи.

Возможно, вы столкнулись с тем, что в поле FIELD используется счетчик изображений, во-первых, это может стать убийцей производительности. Вместо этого, вы можете просто сделать левый присоединиться непосредственно к столу галереи и COUNT отчетливые R_IDs из галереи для соответствующей подкатегории

SELECT 
     t_sub_cat.r_id, 
     t_sub_cat.f_sub_cat_name, 
     MIN(COALESCE(t_gal.f_image_thumb, '')) as JustOneThumbImg, 
     COUNT(DISTINCT(t_gal.r_id)) SubCategoryImageCount 
    FROM 
     t_sub_category t_sub_cat 
     LEFT JOIN t_gallery t_gal 
      ON t_sub_cat.r_id = t_gal.f_sub_category_id 
    GROUP BY 
     t_sub_cat.r_id 
    ORDER BY 
     t_sub_cat.f_added_on DESC 

Поскольку вы не захватывая все галереи изображений (так как некоторые из них не может существовать Для данной подкатегории) упорядочение по t_gal.r_id не имеет смысла

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

0

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

вы могли бы попробовать это: sqlfiddle

select 
t_gal.f_sub_category_id, 
t_sub_cat.f_sub_cat_name, 
(
    SELECT COUNT(*) 
    FROM t_gallery 
    WHERE f_sub_category_id = t_gal.f_sub_category_id) 
    AS f_image_total 
from t_sub_category as t_sub_cat 
left join t_gallery t_gal on t_gal.f_sub_category_id = t_sub_cat.r_id 
GROUP BY t_sub_cat.r_id 
ORDER BY t_gal.r_id DESC;