2013-03-05 161 views
0

我试图获取存在的子记录数量的类别列表。如果类别没有记录,它应该返回NULL或0,但是我的查询返回具有子记录的类别看起来像跳过没有子记录的类别。 ...会非常感谢帮助。mysql左连接不返回空行

这里是我的代码:

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(*)f_image_total FROM t_gallery TG 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 2013-03-05 13:26:06

回答

0

问题似乎是你的group by子句。

您正在使用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的select语句...首先,这可能会成为一个性能杀手。相反,你可以只是做一个直接左加入到库表和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;