mysql左连接不返回空行

时间:2013-03-05 12:19:19

标签: mysql left-join

我正在尝试获取包含子记录数量的类别列表。如果类别没有记录,它应该返回NULL或0,但我的查询返回带有子记录的类别看起来像是跳过没有子记录的类别。 ...真的很感激帮助。

这是我的代码:

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

它看起来像每个子类别(以前选择的类别),你想要包括所有子类别...而且,在那些子类别中,你想要计算多少个图像的子类别类别天气与否甚至是画廊表中的图像。

你可能遇到的是用于计算图像的FIELD的select语句......首先,它可能成为性能杀手。相反,您可以直接对画廊表进行左连接,并从库中对相应的子类别中的不同R_ID进行COUNT

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排序没有意义

另外,我之所以没有预先抓取子查询中的聚合来加入...我不想从每个类别/子类别获取所有内容而不知道哪些子类别与之关联你真正想要的类别。

答案 2 :(得分: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;
相关问题