2011-03-31 97 views
0

我想为每个用户相册统计照片数量,一切顺利,直到用户没有在一个相册中的照片,然后(我认为)WHERE ap.del = 0做那个相册没有出现。请帮助,DB是Postgresql!SQL连接问题

SELECT a.id_album, a.id_osoba, a.name, a.description, a.privacy, a.del, a.data_del, a.cover, a.date, count(ap.id_album_photo) AS ilosc 
    FROM album a 
    LEFT JOIN album_photo ap ON ap.id_album = a.id_album 
    WHERE ap.del = 0 
    GROUP BY a.id_album, a.id_osoba, a.name, a.description, a.privacy, a.del, a.data_del, a.cover, a.date 
    ORDER BY a.name; 

回答

2

如果你想让它显示出来的时候没有album_photo不管,你可以这样做:

WHERE ap.del = 0 OR ap.id_album IS NULL 

如果没有album_photo,在LEFT JOIN将只返回所有album_photo值NULL 。检查对NULL的连接键会显示该行没有在加入。

1

移动WHERE ap.del = 0JOIN

LEFT JOIN album_photo ap ON ap.id_album = a.id_album AND ap.del = 0

ap.del将NULL当没有album_photo,这意味着WHERE子句将过滤掉ap.del为空的行。由于NULL = 0未知并返回false。

同样的事情适用于任何时候您想过滤LEFT/RIGHT JOIN

1

如何:

SELECT 
    a.id_album, 
    a.id_osoba, 
    a.name, 
    a.description, 
    a.privacy, 
    a.del, 
    a.data_del, 
    a.cover, 
    a.date, 
    SUM(CASE 
     WHEN ap.id_album_photo IS NOT NULL THEN 1 
     ELSE 0 
    END) AS liczba 
FROM 
    album AS a 
LEFT JOIN 
    album_photo AS ap 
ON 
    a.id_album = ap.id_album 
AND 
    ap.del = 0 
GROUP BY 
    a.id_album, 
    a.id_osoba, 
    a.name, 
    a.description, 
    a.privacy, 
    a.del, 
    a.data_del, 
    a.cover, 
    a.date 
ORDER BY 
    a.name; 

SELECT 
    a.id_album, 
    a.id_osoba, 
    a.name, 
    a.description, 
    a.privacy, 
    a.del, 
    a.data_del, 
    a.cover, 
    a.date, 
    COALESCE(ap.liczba, 0) AS liczba 
FROM 
    album AS a 
LEFT JOIN 
    (
     SELECT 
      ap.id_album, 
      COUNT(1) AS liczba 
     FROM 
      album_photo AS ap 
     WHERE 
      ap.del = 0 
     GROUP BY 
      ap.id_album 
    ) AS ap 
ON 
    ap.id_album = a.id_album 
ORDER BY 
    a.name;