1

オブジェクトとタグの 2 つのテーブルがあります。オブジェクトに関連付けられた各タグの行を持つ、objects_tags という名前のクロステーブルを作成しました (申し訳ありませんが、用語に慣れていません...)。オブジェクトには多くのタグがあり、タグは多くのオブジェクトに関連付けられている場合があります。

したがって、オブジェクトは次のようになります

  +--------+----------------------------------------+
  | Object | Data                                   |
  |--------|----------------------------------------|
  |Object1 | Lorem Ipsum                            |
  |Object2 | Lorem Ipsum                            |
  |Object3 | Lorem Ipsum                            |
  |        |                                        |
  |        |                                        |
  |        |                                        |
  |        |                                        |
  |        |                                        |
  +--------+----------------------------------------+

データは関係ありません。タグは基本的に同じように見えます:

  +--------+----------------------------------------+
  | Tag    | Data                                   |
  |--------|----------------------------------------|
  |Tag1    | Lorem Ipsum                            |
  |Tag2    | Lorem Ipsum                            |
  |Tag3    | Lorem Ipsum                            |
  |        |                                        |
  |        |                                        |
  |        |                                        |
  |        |                                        |
  |        |                                        |
  +--------+----------------------------------------+

私の「クロステーブル」は次のようになります

  +--------+----------------------------------------+
  | Object | Tag                                    |
  |--------|----------------------------------------|
  |Object1 | Tag1                                   |
  |Object2 | Tag1                                   |
  |Object2 | Tag2                                   |
  |Object1 | Tag3                                   |
  |Object3 | Tag2                                   |
  |Object3 | Tag3                                   |
  |        |                                        |
  |        |                                        |
  +--------+----------------------------------------+

そして、私ができるようにしたいのは、Tag1 と Tag2 の両方を持つすべてのオブジェクトを取得することです (たとえば)。ここでは、object2 のみが返されます。

動作しない MySQL コマンドは次のとおりです。

SELECT * FROM objects JOIN objects_tags ON objects_tags.id=objects.id WHERE ( objects_tags.tag = ? AND objects_tags.tag = ? )

? は検索対象のタグに置き換えられ、PDO としてラップされます。結合から返された単一の行には複数のタグが関連付けられていないため、このクエリは何も返しません。また、複数のタグに一致する行を要求しています (ここでは AND を使用していますが、OR を使用しても機能しません。すべての検索語に一致します。この結果は範囲が広すぎます。すべての検索語に一致させたいと思います)。行ごとに 1 つのタグを含む複数の行を返す必要があり、それぞれに対して検索したいと考えています。ユーザーが指定したいくつかのタグでタグ付けされたオブジェクトのみを返したいのですが、そのクエリを作成する方法がわかりません。何か助けはありますか?

4

1 に答える 1

1

2 つの要件があるため、2 つの結合objects_tagsが必要です。objects_tags

SELECT objects.Object
FROM objects
JOIN objects_tags ot1 ON (objects.Object = ot1.Object AND ot1.Tag = 'Tag1')
JOIN objects_tags ot2 ON (objects.Object = ot2.Object AND ot2.Tag = 'Tag2')
于 2013-04-03T22:48:41.193 に答える