2013-03-05 158 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;