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!
- 1388 megtekintés
Hozzászólások
Nekem ez van bekönyvjelzőzve erre, amarokot turkálni megfelelő volt.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Köszi, ki fogom próbálni!
- A hozzászóláshoz be kell jelentkezni