セットの交差点

私はSQLソリューションがこのタイプの問題のために何であるかを覚えようとしています。私は次のテーブルを持っているとしましょう:

tagged_nodes:

  1. nid - Node id. Foreign key.
  2. tid - Tag id. Foreign key.
  3. tnid - Primary key (irrelevant to the problem at hand).

nodes:

  1. nid - Node id. Primary key.
  2. ... - Other columns are irrelevant.

タグID( tid )のセットがあると仮定して、関連するノード(交差点)のセットを返したいとします。これはどうすればいいですか?

0

2 答え

SELECT nodes.* FROM nodes                           /* Load node info */
JOIN tagged_nodes ON tagged_nodes.nid = nodes.nid   /* Match node-tag rows with node rows */
WHERE tagged_nodes.tid IN (1, 2, 3)                 /* Filter using tag relationship */
4
追加された
ああ、ありがとう。簡単な問題のようだ。
追加された 著者 Hamster,
あなたが正しいと思います。それを指摘してくれてありがとう。
追加された 著者 Hamster,
@ハムスター、これをしてもよろしいですか?ハンスの答えは交差点とは呼ばれませんでした。
追加された 著者 ypercubeᵀᴹ,
確かに、助けてうれしい!
追加された 著者 Jon Gauthier,

だからここに私が思い付いたことがあります:

$this->Sql = 'SELECT DISTINCT * FROM `nodes` `n`
    JOIN `tagged_nodes` `t` ON t.nid=n.nid';

 $i=0;
foreach( $tagids as $tagid ) {
     $t = 't' . $i++;
    $this->Sql .= ' INNER JOIN `tagged_nodes` `'.$t.'` ON '
        .$t'.tid=t.tid WHERE '.$t.'.tid='.$tagid;
}

私はそれが動的である必要があるので、それはPHPにありますが、2つのタグ( animalspets )だけが必要な場合、基本的には次のようになります。

SELECT * FROM nodes n JOIN tagged_nodes t ON t.nid=n.nid
INNER JOIN tagged_nodes t1 ON t1.tid=t.tid WHERE t1.tid='animals'
INNER JOIN tagged_nodes t2 ON t2.tid=t.tid WHERE t2.tid='pets'

正しい軌道にいるのですか?

1
追加された