0

これは、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 のみの配列になります。

みんなの助けに感謝します。

4

2 に答える 2

1

テーブルをそれ自体と結合する必要があります。コードは少し複雑になる可能性があります。PHP の方が簡単ですが、それほどパフォーマンスの高いソリューションではありません。

于 2013-10-24T08:37:01.903 に答える
0

ph_id に基づいてテーブルを結合し、table1 インスタンスの tab_id 列が 1 に等しく、table2 インスタンスの tab_id が 5 に等しいことを確認する必要があります。

SELECT t1.* FROM tag_map t1, tag_map t2
WHERE t1.ph_id = t2.ph_id
AND t1.tag_id='1' 
AND t2.tag_id='5';

必要に応じて内部結合を使用

SELECT t1.* FROM tag_map t1
INNER JOIN tag_map t2 on t2.ph_id=t1.ph_id
WHERE t1.tag_id='1' 
AND t2.tag_id='5';
于 2013-10-24T08:34:15.793 に答える