これは、MYSQL をよく使用する人にとっては簡単なことだと思いますが、検索する適切な用語を知らないことが主な原因で、まったく理解できません。
基本的に、tag_map と呼ばれるタグ ID を写真 ID にマッピングするテーブルがあります。このクエリを実行すると:
SELECT * FROM tag_map WHERE tag_id='1' OR tag_id='5';
次の結果が得られます。
ph_id tag_id
1 1
2 1
5 1
7 5
8 1
9 5
10 5
11 1
12 1
13 1
しかし、私が本当に望んでいるのは、tag_id が「1」と「5」の両方を持つ ph_id のみを選択することです。
ご覧のとおり、複数のタグに基づいて選択をフィルタリングしようとしています。私は最終的にしたい:
ph_id tag_id
7 1
7 5
8 1
8 5
11 1
11 5
したがって、ph_id 7、8、および 11 は、tag_id 1 および 5 を参照します。
それが理にかなっていることを願っています。
ありがとう。
解決
私のクエリの動的な性質(ユーザーが選択を絞り込むために利用可能なタグをいくつでも選択する)により、@YU NO WORKが提案するように、PHPソリューションを使用しました
基本的に、テーブル「tags」から選択したすべてのタグのtag_idを取得します
次に、テーブル tag_map から選択した tag_ids にマップされているすべての写真 ID (ph_id) を選択しました。
次に、これを、選択したタグの数と同じ回数発生する ph_ids に減らします。
$numTags = count($arTagId); //$arTagId is an array of the selected tags
// get only photo ids that match both tags
$arPhId = array();
// in arPhId, find ph_ids that have occurances equal to $numTags
$arPhIdCnt = array_count_values($arPhIdAll); //$arPhIdAll is array of all ph_id that match all selected tag_ids
foreach($arPhIdCnt as $pid => $pidQty) {
if($pidQty == $numTags) {
$arPhId[] = $pid;
}
}
したがって、両方の tag_id に一致する ph_id のみの配列になります。
みんなの助けに感謝します。