Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Allgemeines zu Drupal ›

Nodes nach Feldinhalt sortieren --> MySQL JOIN?

Eingetragen von Toro (49)
am 07.01.2011 - 14:06 Uhr in
  • Allgemeines zu Drupal
  • Drupal 7.x

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

‹ Drupal Firebug Problem watchdog: Lokalisierung JavaScript-Datei ...wurde geparst ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

Jo, einfach

Eingetragen von Cyberschorsch (782)
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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo Cyberschorsch!Vielen

Eingetragen von Toro (49)
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:

Zitat:

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!

  • Anmelden oder Registrieren um Kommentare zu schreiben

Nein das ist nicht ganz

Eingetragen von Cyberschorsch (782)
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'];
?>

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo!Danke für den Code.

Eingetragen von Toro (49)
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:

<?php
foreach ($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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Achso, entschuldige, ich hab

Eingetragen von Cyberschorsch (782)
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

<?php
var_dump
($result);
?>

dir ausgibt.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Danke!!Tut mir leid: Zwar

Eingetragen von Toro (49)
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 BY

Nach 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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Listen

Eingetragen von stBorchert (6003)
am 11.01.2011 - 11:26 Uhr

Hallo.

Toro schrieb

...ohne Views ...

Nur mal der Neugierde halber nachgefragt: warum nicht mit Views?

 Stefan

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo Stefan! stBorchert

Eingetragen von Toro (49)
am 11.01.2011 - 12:11 Uhr

Hallo Stefan!

stBorchert schrieb

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!

  • Es geht mir nur um ganz wenige MySQL-Abfragen. Momentan kommt mir das Modul hierfür einfach zu riesig vor.
  • Die Daten für den Inhaltstyp, um den es hier konkret geht, müssen sehr spezifisch als Tabelle ausgegeben werden.
  • 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.
  • Ich möchte Drupal 7 noch besser verstehen.

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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Views

Eingetragen von stBorchert (6003)
am 11.01.2011 - 13:02 Uhr
Toro schrieb

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 :)

Toro schrieb

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).

Toro schrieb

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.

Toro schrieb

Ich möchte Drupal 7 noch besser verstehen.

Das ist äußerst löblich.

Toro schrieb

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, ...

Toro schrieb

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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hi Stefan! Vielen Dank für

Eingetragen von Toro (49)
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.

stBorchert schrieb

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!!

stBorchert schrieb

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

  • Anmelden oder Registrieren um Kommentare zu schreiben

join

Eingetragen von stBorchert (6003)
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();
?>

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo Stefan!Perfekt. Ich

Eingetragen von Toro (49)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Für Fields wird eben als 2.

Eingetragen von Exterior (2903)
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'));
?>

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo! Habe ich gerade

Eingetragen von Toro (49)
am 12.01.2011 - 23:43 Uhr

Hallo!

Habe ich gerade erfolgreich getestet.

Schönen Dank und viele Grüße
Toro

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
  • Composer nach Umzug
  • [gelöst] Taxonomie Begriffe zeigt nicht alle Nodes an
  • Drupal 11 + Experience Builder (Canvas) + Layout Builder
  • Welche KI verwendet ihr?
  • Update Manger läst sich nicht Installieren
Weiter

Neue Kommentare

  • melde mich mal wieder, da ich
    vor 2 Wochen 1 Tag
  • Hey danke
    vor 2 Wochen 2 Tagen
  • Update: jetzt gibt's ein
    vor 2 Wochen 2 Tagen
  • Hallo, im Prinzip habe ich
    vor 3 Wochen 3 Stunden
  • Da scheint die Terminologie
    vor 3 Wochen 6 Stunden
  • Kannst doch auch alles direkt
    vor 3 Wochen 4 Tagen
  • In der entsprechenden View
    vor 3 Wochen 4 Tagen
  • Dazu müsstest Du vermutlich
    vor 3 Wochen 4 Tagen
  • gelöst
    vor 6 Wochen 1 Tag
  • Ja natürlich. Dass ist etwas,
    vor 6 Wochen 2 Tagen

Statistik

Beiträge im Forum: 250233
Registrierte User: 20452

Neue User:

  • ByteScrapers
  • Mroppoofpaync
  • 4aficiona2

» Alle User anzeigen

User nach Punkten sortiert:
wla9461
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 24 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association