SQL kérdés: INTERSECT helyett, MySQL

Sokan ismerik a Drupal adatbázissémáját.
Akik nem, annak az alapfelállás (a kérdéshez fölösleges oszlopokat kitöröltem):

CREATE TABLE `term_node` (
`nid` int(10) unsigned NOT NULL default '0',
`tid` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`tid`,`vid`),
KEY `vid` (`vid`),
KEY `nid` (`nid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


CREATE TABLE `term_data` (
`tid` int(10) unsigned NOT NULL auto_increment,
`nid` int(10) unsigned NOT NULL default '0',
`name` varchar(255) NOT NULL default '',


CREATE TABLE `node` (
`nid` int(10) unsigned NOT NULL auto_increment,
`title` varchar(255) NOT NULL default '',

Hogyan kérnétek le azokat a node.title-ket, amikhez adott term_data.name-k vannak rendelve (tehát 2 vagy több)?

Egy term_data.name esetén a megoldás még számomra is triviális:

select n.title, d.name from node as n left join term_node as tn on n.nid = tn.nid left join term_data as d on d.tid = tn.tid where d.name = 'FOO';

Több term_data.name esetén van ötletem INTERSECT halmazművelettel való megoldásra, de nagyon csúnya, ráadásul a MySQL nem is támogatja (megfelelő tid-eket subquery-ben lekérni és intersectelve átadni a node-ot lekérdező query-nek). Nyilván lehet olyat csinálni MySQL-ben is, mintha INTERSECT volna, de kíváncsi vagyok, hogy kinek van rá jobb ötlete?
Ha javasoltok célszerűbb sémát a mostaninál, akkor azt is szívesen veszem!

Hozzászólások


SELECT
n.title, d.name
FROM node as n
LEFT JOIN term_node as tn on n.nid = tn.nid
LEFT JOIN term_data as d on d.tid = tn.tid
WHERE d.name IN ('FOO', 'BAR', 'BAZ')
GROUP BY n.nid
HAVING COUNT(n.nid) > 2;

valami ilyesmi de nem probaltam ki

Tyrael