Пересечение множеств - PullRequest
       7

Пересечение множеств

0 голосов
/ 13 ноября 2011

Я пытаюсь вспомнить, что решение SQL для этого типа проблемы. Допустим, у меня есть следующие таблицы:

tagged_nodes * * 1004

  1. nid - идентификатор узла. Внешний ключ.
  2. tid - идентификатор тега. Внешний ключ.
  3. tnid - первичный ключ (не имеет отношения к рассматриваемой проблеме).

nodes

  1. nid - идентификатор узла. Первичный ключ.
  2. ... - Другие столбцы не имеют значения.

Предполагая, что у меня есть набор идентификаторов тегов (tid), я хочу вернуть набор связанных узлов (пересечение). Как мне это сделать?

Ответы [ 2 ]

4 голосов
/ 13 ноября 2011
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 */
0 голосов
/ 17 ноября 2011

Итак, вот что я придумала:

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

Я на правильном пути?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...