0

我正在尝试获取其中存在子记录数量的类别列表。如果类别没有记录,它应该返回 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

这是两张表:

在此处输入图像描述

在此处输入图像描述

4

3 回答 3

0

看起来对于每个子类别(先前选择的类别),您想要包括所有该子类别......并且,在这些子类别中,您想要计算该类别的图像数量画廊表中甚至没有图像。

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

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

另外,我没有在子查询中预先抓取聚合以加入反对的原因......我不想在不知道哪些子类别与您的类别相关联的情况下从每个类别/子类别中获取所有内容其实想要。

于 2013-03-05T13:39:23.577 回答
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
于 2013-03-05T13:34:09.423 回答
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;
于 2013-03-05T13:43:07.377 回答