mysql左连接未返回空行
我正在尝试获取类别列表,其中包含大量的子记录。如果类别没有记录,则应返回NULL或0,但我返回包含子记录的类别的查询似乎跳过了不包含子记录的类别。。。我会非常感谢你的帮助 这是我的密码:mysql左连接未返回空行,mysql,left-join,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_g
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
这是两张桌子:
问题似乎是您的分组依据子句 您正在按左侧联接表上的字段进行分组,因此,当按左侧联接表上没有匹配行的所有行进行分组时,该表上的所有行似乎都会聚合为一行 我想你想得到的是一个画廊项目列表,以及它们所在的类别(如果找到的话)和同一类别中其他画廊的数量。如果是,请尝试以下方法(如果不是,请让我知道!)
看起来,对于每个子类别(以前选择的类别),您都希望包含该子类别的所有内容。。。并且,在这些子类别中,您需要计算该类别的图像数量,无论在gallery表中是否有图像 您可能遇到的是用于计数图像的字段的select语句。。。首先,这可能成为性能杀手。相反,您可以直接向gallery表执行左联接,并计算对应子类别的gallery中不同的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排序是没有意义的
另外,我没有在子查询中预抓取聚合以加入的原因。。。我不想在不知道哪些子类别与您真正想要的类别相关联的情况下从每个类别/子类别中获取所有信息。您查询的问题是,您使用的是t_gallery作为主表,而不是t_sub_category,同时使用left join 你可以试试这个:
您可以检查:
选择tg.f_sub_category_id,tsc.f_sub_category_name,tg.f_image_thumb,count(*)f_image_total FROM t t_gallery tg LEFT JOIN t_sub_category tsc.r_id=tg.f_sub_category_id GROUP BY tg.f_sub_category_id,tg.f_sub_category_id,tg.r_id按tsc.f_category_id,tg.r_顺序按tsc.f_添加到t代码>?
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
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;