Kurztutorial - MySQL JOINs mit Drupal
Wer komplizierte Datenbank Abfragen braucht, kommt mit views ganz schön weit. Wenn die Daten zu einem node über viele Tabellen verteilt sind und es keine Views-Integration gibt, was dann?
Man kann JOINs nutzen. Das kann in einigen Fällen auch zu schnelleren Abfragen führen. Hie ein Beispiel:
<?php
$query = db_query(db_rewrite_sql("SELECT
n.nid,
n.title,
n.sticky,
term_data.tid,
term_data.name,
term_data.weight,
term_hierarchy.parent,
content_type_deinTyp.field_deinFeld_fid,
files.filename,
files.filepath,
FROM {node} n
INNER JOIN content_type_deinTyp ON content_type_deinTyp.nid = n.nid
LEFT JOIN files ON content_type_deinTyp.field_deinFeld_fid = files.fid
INNER JOIN term_node ON term_node.nid = n.nid
LEFT JOIN term_data ON term_node.tid = term_data.tid
LEFT JOIN term_hierarchy ON term_hierarchy.tid = term_data.tid
WHERE n.type = 'deinTyp' AND term_data.vid = 9
ORDER BY term_hierarchy.parent, term_data.weight, term_data.name, n.sticky DESC, n.title"));
while ($nodes = db_fetch_object($query)) {
// Daten verwenden
}
?>
Verwirrt? Also Schritt für Schritt:
- wir packen die ganze Abfrage wie gehabt in die beiden Drupal Funktionen
db_query()
unddb_rewrite_sql()
(dazu auch hier:http://www.drupalcenter.de/handbuch/6722). - Nach
SELECT
folgen alle felder die abgefragt werden sollen nach folgendem schema:tabellenname.feldname
(also:n.nid, n.title, n.sticky, term_data.tid, usw.
) Wenn man alles aus einer tabelle braucht geht auchtabellenname.*
- Danach, also hinter
FROM
, wird angegeben wie die Tabellen verknüpft werden sollen (JOIN
) FROM {node} n
ist die Haupttabelle sozusagen (die am weitesten links in der Abfrage steht!) -> eine Besonderheit noch: dem tabellenname{node}
wird das Kürzel "n" gegeben. Damit kann man node.nid auch mit n.nid ansprechen.- und jetzt die JOINS. "
INNER JOIN content_type_deinTyp ON content_type_deinTyp.nid = n.nid
" bedeutet, dass die Tabellencontent_type_deinTyp
undnode
verknüpft werden sollen. Und zwar überall da, wo NodeID (nid) in node (n.nid
) und in content_type_deinTyp (content_type_deinTyp.nid
) gleich sind => "ON content_type_deinTyp.nid = n.nid
" - So, das wars schon fast. Jetzt sollte man noch erwähnen, dass
INNER JOIN
bedeutet, dass nur Einträge bei der Abfrage rauskommen, die in beiden Tabellen übereinstimmende Werte in den gewünschten Feldern haben (hier die NodeID). LEFT
JOIN hingegen heisst, dass die Werte der linken Tabelle auf jeden Fall bei der Abfrage rauskommen und immer wenn vorhanden mit den Zeilen der Rechten Tabelle verknüpft werden. LEFT JOIN files ON content_type_deinTyp.field_deinFeld_fid = files.fid
Das nochmal weniger wortreich:
SELECT n.nid, usw.
listet alle gewünschten FelderFROM {node} n
nennt die HaupttabelleINNER JOIN content_type_deinTyp ON content_type_deinTyp.nid = n.nid
verknüpft dienode
Tablle mit der zugehörigen CCK Tablle, und zwar nur da, wo in beiden Tabellen Werte vorhanden sind.LEFT JOIN files ON content_type_deinTyp.field_deinBild_fid = files.fid
sucht wenn vorhanden zugehörige BilderINNER JOIN term_node ON term_node.nid = n.nid
sucht zugehörige Taxonomy-Terms (in der Tabelle stehen nur Zahlen)LEFT JOIN term_data ON term_node.tid = term_data.tid
holt die zugehörigen Term-NamenLEFT JOIN term_hierarchy ON term_hierarchy.tid = term_data.tid
holt zugehörige übergeordnete TermsWHERE n.type = 'deinTyp' AND term_data.vid = 9
nur vom Typ "deinTyp" und wo es Terms aus Vokabular 9 gibtORDER BY term_hierarchy.parent, term_data.weight, term_data.name, n.sticky DESC, n.title"
und noch vorsortieren, erst nach übergeordnetem Taxonomy-Term, dann nach Term-Gewichtung, dann Terms alphabetisch, dann erst die sticky nodes, und dann alphabetisch nach node Name.
Voll easy oder? ;) Wenn ichs wieder vergessen hab, kann ich ja hier nachschauen. Vieleicht hilfts jemandem.
- Anmelden oder Registrieren um Kommentare zu schreiben
Held ;-)
am 25.02.2008 - 18:47 Uhr
Held ;-)
-----------------------------------
Drupal Ruhrgebiet Usergroup
http://groups.drupal.org/ruhrgebiet
Tolle Erklärung
am 18.09.2008 - 20:52 Uhr
Tolle Erklärung =D
-------------------------------------
Meine Entwicklungen:
www.minis-kuemmersbruck.de | www.hausmeisterteam-glaser.de
-------------------------------------
www.minis-kuemmersbruck.de | www.hausmeisterteam-glaser.de