2010-11-15 100 views
1

我目前正在構建一個自定義照片集,但現在我堅持使用mysql查詢。 查詢的想法是獲取專輯列表,計算其中的圖片數量,並獲取每個專輯的一個縮略圖。如何選擇照片,計數照片,併爲每張相冊選擇一張照片?

數據庫現在包含兩個表格,一個包含專輯數據,另一個包含圖片(我將它們存儲在數據庫中)。

表:photoalbums

id | album_name | album_created 
------------------------------------- 
1 | testalbum | 2010-11-07 19:33:20 
2 | some more | 2010-11-15 18:48:29 

表:圖片

id | file | thumbnail | name | album_id 
------------------------------------------ 
1 | binary | binary | test1 | 1 
2 | binary | binary | test2 | 1 
3 | binary | binary | test3 | 2 
4 | binary | binary | test4 | 2 
5 | binary | binary | test5 | 1 

我當前的查詢看起來是這樣,但顯然是行不通的。

SELECT alb.id album_id, alb.album_name, alb.album_created, COUNT(p.id) pcount FROM photoalbums alb LEFT JOIN pictures p ON p.album_id=alb.id GROUP BY p.album_id ORDER BY alb.album_name ASC 

首先,這個查詢會獲取相冊中的所有縮略圖,而我只想要一個(作爲預覽)。接下來,它似乎停止在一個專輯,我認爲這是造成這種情況的GROUP BY聲明。

我是否需要爲while()循環中的每個專輯執行額外查詢以獲取每個專輯的單個縮略圖,或者我可以只使用一個查詢來執行該操作嗎?導致只有一張專輯出現在記錄集中的錯誤是什麼?

提前致謝!

回答

1

通常情況下,我認爲你會希望按SELECT列表中的所有非聚合列進行分組,以獲得預期的結果。而這發生在我選擇每張專輯一(任意)縮略圖的第一種方式會是這樣的(未經測試):

SELECT alb.id AS album_id, alb.album_name, alb.album_created, 
     COUNT(p.id) AS pcount, 
     MAX(p.thumbnail) AS thumbnail 
FROM photoalbums alb 
LEFT JOIN pictures p ON p.album_id=alb.id 
GROUP BY alb.id, alb.album_name, alb.album_created 
ORDER BY alb.album_name ASC 
+0

謝謝你,這是解決我的問題! – carlo 2010-11-16 10:18:44

0

這可能不是答案,但我認爲當你別名字段時,你錯過了一個AS語句。

從邏輯上講,這個查詢應該工作,雖然我沒有測試它:

SELECT photoalbums.ID, photoalbums.Name, photoalbums.Created, Count(photoalbums.ID) AS pCount 
FROM photoalbums 
INNER JOIN pictures ON pictures.album_id = photoalbums.id 
GROUP BY pictures.album_id 
ORDER BY photoalbums.album_name ASC 

或者你可以做一個子查詢:

SELECT thumbnail FROM pictures 
WHERE ID IN (SELECT ID FROM phtoalbums) 
GROUP BY album_id 

雖然它如果不這樣做子查詢的最佳實踐你可以避開它們。