我正在努力记住SQL解决方案对于此类问题的解决方案。假设我有以下表格:
tagged_nodes
:
nid
- 节点ID。外键。tid
- 标记ID。外键。tnid
- 主键(与手头的问题无关)。 nodes
:
nid
- 节点ID。主键。假设我有一组标记ID(tid
),我想返回一组关联的节点(交集)。我该怎么做?
答案 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个标签(animals
,pets
),它基本上就是以下内容。
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'
我是在正确的轨道上吗?