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),而且还计算各自表格中画廊和照片的数量?我正在尝试简化我的查询并了解有关使我的代码高效的更多信息。任何帮助将不胜感激。

更新:

我不确定如何在这里进行表格结构格式化,但这里是纯文本:

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

我希望这会有所帮助,如果没有,请告诉我如何重新格式化它。

4

3 回答 3

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

您可以遍历它以填充数组或其他任何内容(问题未指定)

于 2012-12-12T22:39:50.590 回答
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:更新为使用列/表名称。

于 2012-12-12T22:40:05.650 回答
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 = ?
于 2012-12-12T22:40:07.053 回答