1

コンテンツを含む 3 つのテーブルを持つデータベースがあり、タグのクエリに基づいてコンテンツを取得する必要があります。

テーブルは次のようになります。

nv_entries:
id - title - year - etc..

nv_tags:
id - entrieid - tag

nv_images:
id - entrieid - source

タグ「russeau」と「fuzz」の両方を持つすべてのエントリが必要だとしましょう。その後、entrieid = entrieid の場所で画像も結合する必要があります。

これはおそらく 1 つのクエリで実行できますが、方法がわかりません。

$query = "SELECT * from nv_entries WHERE ???

助けてください

4

2 に答える 2

1

エントリとタグの間には 1 対多の関係があるため、タグ テーブルでピボット テーブルを使用する必要があります。where tag = 'x" と tag = 'y" を指定するだけでは機能しません。これは、エンジンが行単位でこれを確認するため、tag が両方の値を同時に持つことができないためです。したがって、基本的にはピボットして、探しているタグ値がエントリに含まれているかどうかを示すフラグを各エントリに割り当てます。

SELECT * 
FROM nv_entries entries 
JOIN (
    SELECT entrieid, 
           COUNT(CASE WHEN (tag = 'rousseau') THEN 1 ELSE null END) has_rousseau,
           COUNT(CASE WHEN (tag = 'fuzz') THEN 1 ELSE null END) has_fuzz
    FROM nv_tags
    GROUP BY entrieid
    HAVING has_rousseau != 0 and has_fuzz != 0
    ) tags ON (entries.id = tags.entrieid)
JOIN nv_images images ON (tags.entrieid = images.entrieid);
于 2012-07-01T13:56:07.640 に答える
0
SELECT * FROM
nv_entries entries
INNER JOIN nv_tags tags ON  tags.entrieid = entries.id
INNER JOIN nv_images imgs ON imgs.entrieid = entries.id
WHERE tags.tag IN('rousseau','fuzz')

ただし、これにより 3 つのテーブルからすべてのデータが抽出されます。冗長なタグをentrieidとして避けるために、テーブルに相対的なタグを指定してください。

于 2012-07-01T13:30:44.483 に答える