2012-12-12 67 views
0

我的數據庫包含有關特定項目的信息。每個項目由多個部分組成,每個部分都有一個或多個照片庫。我想知道是否可以只使用一個查詢來計算與任何給定項目關聯的項目部件,畫廊和照片的數量。目前系統中有1個項目有3個部分,5個畫廊和302個照片。如何使用一個查詢從多個表中統計行

這個查詢(以感謝在座的許多人從SO)工作正常來算每個項目的部分,目前是3號:

// count number of parts per project 
$conn = dbConnect('query'); 
$galNumb = "SELECT COUNT(*) FROM pj_parts WHERE pj_id = ?"; 
$stmt = $conn->prepare($galNumb); 
$stmt->bind_param('i', $project); 
$stmt->bind_result($galTotal); 
$stmt->execute(); 
$stmt->store_result(); 
$stmt->fetch(); 

加以改變來算,不僅部件的數量(pj_part),還要計算來自各自表格的畫廊和照片的數量?我正試圖簡化我的查詢並瞭解更多有關使我的代碼高效的信息。任何幫助將真誠感謝。

UPDATE:

我不能肯定該怎麼辦表結構在這裏格式化,但在這裏它是純文本:

pj_parts 
pj_part_id (primary key) 
pj_id (project number) 
pj_part (part number within project) 

pj_part_galleries 
pj_gallery_id (primary key) 
pj_id (project number) 
pj_part (part number within project) 
pj_gallery (gallery number) 

pj_photos 
pj_photo_id (primary key) 
pj_id (project number) 
pj_part (part number within project) 
pj_gallery_number 

我希望這可以幫助,如果沒有,請讓我知道如何重新格式化它。

+2

什麼是您的表格結構? –

+0

首先,我需要知道您的其他表格和他們的公鑰是什麼,以幫助 – DrinkJavaCodeJava

回答

2

如果使用UNION

SELECT 'pj_parts' as tablename, COUNT(*) as c 
    FROM pj_parts WHERE something=something 
UNION 
SELECT 'pj_galleries' as tablename, COUNT(*) as c 
    FROM some_other_table WHERE something=something 
UNION 
SELECT 'pj_photos' as tablename, COUNT(*) as c 
    FROM some_other_other_table WHERE something=something 

你會得到這個

tablename   | c 
------------------+-------- 
pj_parts   | 3 
pj_galleries  | 5 
pj_photos   | 302 

,你可以遍歷或許填充數組或什麼(問題沒有明確規定)

+0

@popnoodles ...我現在就試試看,謝謝! – wordman

+0

但是這些表被加入?因爲其他答案假定他們是,如果是這樣,那些答案使用更好的方法。 – Popnoodles

+0

表格未加入,我只是想根據特定項目編號計算每個表格的項目數量。 – wordman

1

感覺如何:

SELECT 
COUNT(DISTINCT p.pj_part_id) AS parts, 
COUNT(DISTINCT g.pj_gallery_id) AS galleries, 
COUNT(DISTINCT ph.pj_photo_id) AS photos, 
FROM 
pj_parts p 
LEFT JOIN pj_part_galleries g ON (g.pj_part = p.pj_part_id) 
LEFT JOIN pj_part_photos ph ON (ph.pj_part = p.pj_part_id) 
WHERE p.pj_id = ? 

您必須添加正確的表格/列名稱。

編輯: 如果使用的mysqli你可以做以下綁定: 替換:

$stmt->bind_result($galTotal); 

有了:

$stmt->bind_result($partsTotal,$galleriesCount,$photosCount); 

注:在這裏,我已經改變了$ galTotal至$ partsTotal。

Edit2:更新爲使用列/表名稱。

+0

@D史丹利,非常感謝!然後,我如何在上面顯示的準備好的語句中綁定結果,以便我可以回顯結果? – wordman

+0

以上爲您以及...謝謝。我現在要嘗試這些。 – wordman

+0

@wordman沒問題。我已經更新了綁定結果。 – Jim

1

猜測你的結構,但是像這樣?

SELECT 
    COUNT(DISTINCT p.part_id) parts , 
    COUNT(DISTINCT g.gal_id) galleries , 
    COUNT(DISTINCT ps.pic_id) photos 
FROM pj_parts p 
    LEFT JOIN {galleries} g on p.part_id = g.part_id 
    LEFT JOIN {photos} ps on g.gal_id = ps.gal_id 
WHERE p.pj_id = ? 
相關問題