如何使用一个查询计算多个表中的行数

时间:2012-12-12 22:34:09

标签: php mysqli

我的数据库包含有关特定项目的信息。每个项目由多个部分组成,每个部分都有一个或多个照片库。我想知道我是否可以只使用一个查询来计算与任何给定项目相关的项目部分,图库和照片的数量。目前系统中有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

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

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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:已更新以使用列/表名。

答案 2 :(得分: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 = ?