集合的交集

时间:2011-11-12 23:16:46

标签: mysql sql

我正在努力记住SQL解决方案对于此类问题的解决方案。假设我有以下表格:

tagged_nodes

  1. nid - 节点ID。外键。
  2. tid - 标记ID。外键。
  3. tnid - 主键(与手头的问题无关)。
  4. nodes

    1. nid - 节点ID。主键。
    2. ... - 其他栏目无关紧要。
    3. 假设我有一组标记ID(tid),我想返回一组关联的节点(交集)。我该怎么做?

2 个答案:

答案 0 :(得分:4)

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 */

答案 1 :(得分:-1)

所以这就是我的想法:

$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'

我是在正确的轨道上吗?