0

私のDBには、特定のプロジェクトに関する情報が含まれています。各プロジェクトは複数の部分で構成されており、各部分には1つ以上のフォトギャラリーがあります。1つのクエリだけを使用して、特定のプロジェクトに関連付けられているプロジェクトパーツ、ギャラリー、写真の数を数えることができるかどうかを知りたいです。現在、システムには3つのパーツ、5つのギャラリー、302枚の写真からなる1つのプロジェクトがあります。

このクエリ(ここでは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

ユニオンを使用する場合

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 に答える