Nodes nach Feldinhalt sortieren --> MySQL JOIN?
am 07.01.2011 - 14:06 Uhr in
Hallo liebe Forianer!
Folgende Problemstellung bekomme ich aber nicht in den Griff:
Alle Nodes eines Inhaltstyps sollen aufgelistet werden (ohne Views), dazu soll der Inhalt mehrerer Felder angezeigt werden. Soweit kein Problem:
<?php
$result = db_query('SELECT * FROM {node} WHERE (type = :type AND language = :language) ORDER BY nid DESC', array(
":type" => "inhaltstyp",
":language" => "de",
));
foreach ($result as $row) {
$nid = $row->nid;
// Feld 1 auslesen
$result = db_query('SELECT feld1 FROM {tabelle1} WHERE entity_id = :entity_id', array(
":entity_id" => $nid,
));
foreach ($result as $row) {
$output .= $row->feld1;
}
// Feld 2 auslesen
$output .= '<td>';
$result = db_query('SELECT feld2 FROM {tabelle2} WHERE entity_id = :entity_id', array(
":entity_id" => $nid,
));
foreach ($result as $row) {
$output .= $row->feld2;
}
}
print $output;
?>Nun aber soll die Ausgabe nach den Inhaltswerten von Feld 2 sortiert werden. Kann mir hierfür jemand einen Tipp geben? Ich krieg's wirklich nicht hin. Vielleicht lässt sich das irgendwie über JOIN regeln?
Vielen Dank
Toro
- Anmelden oder Registrieren um Kommentare zu schreiben

Jo, einfach
am 07.01.2011 - 15:14 Uhr
Jo, einfach joinen:
<?php$result = db_query(
'SELECT tabelle1.feld1, tabelle2.feld2 FROM {node} node, {tabelle1} tabelle1, {tabelle2} tabelle2
WHERE (node.nid = tabelle1.nid AND node.nid=tabelle2.nid AND type = :type AND language = :language) ORDER BY tabelle2.feld2 DESC', array(
":type" => "inhaltstyp",
":language" => "de",
));
?>
Nicht getestet sollte aber funktionieren denk ich.
Hallo Cyberschorsch!Vielen
am 07.01.2011 - 16:10 Uhr
Hallo Cyberschorsch!
Vielen Dank! Das sieht einfacher aus als befürchtet.
Da es eine Fehlermeldung gab, habe ich um Folgendes erweitert "db_query->join", bin aber nicht sicher, ob das richtig ist.
Dadurch ergibt sich folgende neue Fehlermeldung, obwohl der Server PHP 5 verwendet:
Parse error: syntax error, unexpected T_OBJECT_OPERATOR
Da ich mich bisher immer um JOIN drücken konnte, habe ich keine Ahnung, war zu tun ist.
Außerdem hätte ich noch folgende Frage, falls es die Abfrage zum laufen kriege: Kann ich z. B. das Wert für Feld1 in Tabelle1 wie folgt ausgeben?
<?php
foreach ($result as $row) {
$wert1 = $row->tabelle1.feld1;
}
?>
Schöne Grüße!
Nein das ist nicht ganz
am 07.01.2011 - 16:24 Uhr
Nein das ist nicht ganz richtig. Ich schreibe dir hier nochmal den Code, aber in der Syntaxweise die ich benutze:
<?php//query
$sql ="SELECT tabelle1.feld1, tabelle2.feld2
FROM {node} node, {tabelle1} tabelle1, {tabelle2} tabelle2
WHERE
node.nid = tabelle1.nid AND
node.nid = tabelle2.nid AND
node.type = %s AND
node.language = %s
ORDER BY tabelle2.feld2 DESC";
//get mysql Result
$data = db_query($sql,'foobar','de');
//fetch as array
while ($data = db_fetch_array($mysqlresult))
{
$result[] = $data;
}
//uncomment next line to check array
//var_dump($result);
//Print
print $result[0]['feld1'];
?>
Hallo!Danke für den Code.
am 07.01.2011 - 18:37 Uhr
Hallo!
Danke für den Code. Das sieht alles extrem nachvollziehbar aus.
Leider bin ich noch nicht am Ziel, obwohl ich die ganze Zeit experimentiert habe. Aufgrund einer Fehlermeldung bin ich darauf gestoßen, dass Drupal 7 den "while"-Befehl nicht mehr wie bisher verwendet. Zur Ausgabe ist scheinbar folgende Vorgehensweise obligatorisch:
<?phpforeach ($result as $row) {
// Ausgabe
}
?>
Kann es deshalb sein, dass der ganze Code - selbst wenn ich die Abfrage unten ändere - nur für Drupal 6 läuft? und falls ja, hättest Du so eine wunderbar logische MySQL-Abfrage auch für D7?
Die HIER beschriebene dynamische Abfrage sagt mir für mein konkretes Problem leider nichts?!
Vielen Dank noch mal!
NACHTRAG: Ein weiteres Beispiel findet sich in diesem Cheat Sheet.
Achso, entschuldige, ich hab
am 10.01.2011 - 20:27 Uhr
Achso, entschuldige, ich hab das übersehen das du das ganze für Drupal 7 brauchst.
Schau dochmal was
<?phpvar_dump($result);
?>
dir ausgibt.
Danke!!Tut mir leid: Zwar
am 11.01.2011 - 11:03 Uhr
Danke!!
Tut mir leid: Zwar hatte ich "Drupal 7" als Tag angegeben, aber nicht im Text gesondert erwähnt.
Die Fehlermeldung lautet
PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'node.language = 'de' ORDER BYNach langem Suchen im Netz glaube ich, dass man mit der leicht modifizierten Drupal 6-MySQL-Syntax nicht weiterkommt. Eine "normale" Abfrage funktioniert perfekt und lautet
<?php$result = db_query('SELECT * FROM {node} WHERE (status = :status AND type = :type AND language = :language) ORDER BY nid DESC', array(
":status" => 1,
":type" => "meinInhaltstyp",
":language" => "de",
));
foreach ($result as $row) {
// Ausgabe
}
?>
Selbst das sieht schon recht anders als bei D6 aus. Die Join-Abfragen (siehe Links oben) funktionieren scheinbar komplett anders?!
Schöne Grüße
Listen
am 11.01.2011 - 11:26 Uhr
Hallo.
...ohne Views ...
Nur mal der Neugierde halber nachgefragt: warum nicht mit Views?
Stefan
Hallo Stefan! stBorchert
am 11.01.2011 - 12:11 Uhr
Hallo Stefan!
Nur mal der Neugierde halber nachgefragt: warum nicht mit Views?
Die Frage ist mehr als berechtigt ;)
Es gibt so einige Gründe. Das soll aber nicht heißen, dass ich nicht auf Views zurückgreifen werde!
Sind das für einen Drupal-Profi gültige Argumente, oder würdest Du trotzdem zu Views raten? (Selbst wenn ja, würde ich gerne den "JOIN-Trick" für D7 kennenlernen.)
Schöne Grüße
Toro
Views
am 11.01.2011 - 13:02 Uhr
Es geht mir nur um ganz wenige MySQL-Abfragen. Momentan kommt mir das Modul hierfür einfach zu riesig vor.
Dafür musst Du Dich nicht um Probleme kümmern, die Du jetzt hast :)
Die Daten für den Inhaltstyp, um den es hier konkret geht, müssen sehr spezifisch als Tabelle ausgegeben werden.
Das bekommt man mit Views auch sehr gut hin (entweder direkt über den Ausgabetyp oder über spezifische Templates).
Bislang habe ich sehr viele Webseiten per Hand erstellt. Wenn ich also weiß, wie JOIN mit D7 funktioniert, geht mir das sogar schneller von der Hand als mit Views.
Schau mal unter Dynamic queries. Dort wird anhand eines Beispiels erklärt, wie Joins funktionieren.
Ich möchte Drupal 7 noch besser verstehen.
Das ist äußerst löblich.
Sind das für einen Drupal-Profi gültige Argumente
Sagen wir mal teilweise. Zum Kennenlernen der Funktionalität ist es ganz sicher ratsam, selbst solche Sachen auszuprobieren. Wenn man jedoch bereits existierende Funktionalität nachbaut, leidet darunter meist die Wartbarkeit, Sicherheit, Performance, ...
oder würdest Du trotzdem zu Views raten?
Ja. Dadurch hast Du ein Modul, auf dessen Funktion Du Dich verlassen kannst (1000x getestet von x Benutzern) und hast zudem noch den Vorteil, eventuell auftretende Fehler auf andere schieben zu können ;)
Stefan
Hi Stefan! Vielen Dank für
am 11.01.2011 - 14:08 Uhr
Hi Stefan!
Vielen Dank für Deine Punkt-für-Punkt-Antworten! Das hilft mir sehr bei der Entscheidung.
Ja. Dadurch hast Du ein Modul, auf dessen Funktion Du Dich verlassen kannst (1000x getestet von x Benutzern) und hast zudem noch den Vorteil, eventuell auftretende Fehler auf andere schieben zu können ;)
Ja, da hast Du wohl recht!!
Schau mal unter Dynamic queries. Dort wird anhand eines Beispiels erklärt, wie Joins funktionieren.
Genau daran hapert es leider (peinlich!). An Cyberschorschs D6 Code kann ich einfach zwei Tabellen + Felder mit der Node-Tabelle joinen. Genau das bräuchte ich für D7. Bei dem Dynamic queries-Beispiel auf drupal.org ist mir das nicht klar.
Toro
join
am 11.01.2011 - 14:50 Uhr
Ungetestet:
<?php$query = db_select('node', 'n')
->fields('nid')
->condition('type', 'dingens')
->condition('laguage', 'de');
$query->join($query, 't1', 'n.nid = t1.nid');
$query->join($query, 't2', 'n.nid = t2.nid');
$result = $query->execute();
?>
Hallo Stefan!Perfekt. Ich
am 11.01.2011 - 19:32 Uhr
Hallo Stefan!
Perfekt. Ich musste den Code nur wenig anpassen, und alles funktioniert perfekt:
<?php
$query = db_select('node', 'n')->extend('PagerDefault')->extend('TableSort');
$query
->condition('n.status', 1)
->condition('n.language', 'de')
->condition('n.type', 'termine')
->fields('n', array('nid', 'title'));
$query->join('test1_tabelle', 'test1', 'n.nid = test1.entity_id');
$query->addField('test1', 'test1_feld');
$query->join('test2_tabelle', 'test2', 'n.nid = test2.entity_id');
$query->addField('test2', 'test2_feld');
$query->orderBy('test2_feld', 'ASC');
$result = $query->execute();
foreach($result as $row) {
$row->test1_feld;
$row->test2_feld;
}
print $output;
?>
Das einzige, was mich wundert ist, dass ich tatsächlich
<?php->fields('n', array('nid', 'title'));
?>
notieren musste - also als array, obwohl ich nur "nid" benötige?!
Vielen Dank und schöne Grüße
Toro
Für Fields wird eben als 2.
am 11.01.2011 - 21:01 Uhr
Für Fields wird eben als 2. Parameter ein Array verlangt. Wenn du nur nid benötigst, dürfte auch das hier reichen:
<?php->fields('n', array('nid'));
?>
Hallo! Habe ich gerade
am 12.01.2011 - 23:43 Uhr
Hallo!
Habe ich gerade erfolgreich getestet.
Schönen Dank und viele Grüße
Toro