Zum Inhalt springen

Datenbankprobleme


flipse

Empfohlene Beiträge

Ich habe 2 Probleme bei einer PHP Anwendung mit meinen SQL Abfragen

zum Einen:

Wenn ich diese SQL Abfrage ausführe funktioniert alles wunderbar, aber wenn meine Tabellen leer sind leider nicht. es muss also in der tabelle b_posts mind. 2 Einträge geben, die aufeinander referenziert sind.

Warum kann er dann nicht einfach 0 ausgeben?

SELECT f.parentID, f.ID, f.name, f.description, f.lastposttime, f.lastpost, f.lastpostuser, f.sort, r.read, r.write, r.edit, p.numtopics, p2.numposts 

FROM b_forums f 


LEFT JOIN ( SELECT COUNT(p.ID) As numtopics, p.postforum, p.threadparent FROM b_posts p WHERE p.threadparent ='0') p ON f.ID = p.postforum 


LEFT JOIN ( SELECT COUNT(p2.ID) As numposts, p2.postforum, p2.threadparent FROM b_posts p2 WHERE p2.threadparent<>'0' ) p2 ON f.ID = p2.postforum 


INNER JOIN rlf_forum_rights r ON f.ID = r.forumID WHERE r.roleID='0' AND r.read = '1' Order by f.sort ASC

es geht dabei um ein Forum. Dies soll die Übersicht sein. Es funktioniert alles gut, wenn ich eben einen Thread habe (eintrag in b_posts mit threadparent=0) und eine antwort (eintrag in b_posts mit threadparent = b_posts ID)

Link zu diesem Kommentar
Auf anderen Seiten teilen

also ich arbeite mit mysql als DBMS.

Wenn alles funktioniert sieht es so aus:

http://www.flipsoft24.de/images/sql.jpg

Das geht aber nur wenn BEiträge vorhanden sind...

Sollte jetzt die Tabelle b_posts leer sein (also quasi noch kein Beitrag vorhanden) bekomme ich einen Fehler

Als Fehlermeldung bekomme ich folgendes

#1048 - Column 'postforum' cannot be null

Außerdem hätte ich es gerne, dass statt NULL 0 ausgegeben wird

Link zu diesem Kommentar
Auf anderen Seiten teilen

Als Fehlermeldung bekomme ich folgendes

#1048 - Column 'postforum' cannot be null

Ohne dass ich jetzt die konkreten Tabellenstruktur kenne, würde ich darauf tippen, dass die Spalte als "not null" deklariert ist oder Schlüsselbestandteil ist und somit nicht null sein darf.

Es ist sehr schwierig Dein Statement zu verstehen ohne die komplette Struktur zu kennen, darum denke ich, dass Du entweder das Statement so verändern musst, dass das Feld eben "Null" sein darf oder Du innerhalb des Statements prüfen musst, ob Daten vorhanden sind, wobei ich hier eine entsprechende Subquery mit If erzeugen würde

Außerdem hätte ich es gerne, dass statt NULL 0 ausgegeben wird

MySQL :: MySQL 5.1 Referenzhandbuch :: 12.2 Ablaufsteuerungsfunktionen

Link zu diesem Kommentar
Auf anderen Seiten teilen

aber das mit statt NULL 0 ausgeben funktioniert nicht.

kannst du mir sagen wie ich das einbauen kann?

ich habe es mit IFNULL(p.numtopics,0) versucht, das gibt aber den Fehler, dass numtopics nicht mehr im abfrageergebnis ist.

wenn ich es im join ändere funktionierts auch nicht, gibt aber auch keinen fehler

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jetzt habe ich aber noch ein zweites Problem mit folgender Abfrage

SELECT p.ID, p.title, p.telapsed, p.timepost, p.lastpost, p.postforum, p.value, p.locked, p.views, p2.numreplies FROM b_posts p

LEFT JOIN ( SELECT COUNT(p2.ID) As numreplies, p2.threadparent FROM b_posts p2

GROUP BY p2.ID) p2 ON p.ID = p2.threadparent

WHERE p.threadparent='0' AND p.postforum='3'

order by p.value DESC, p.telapsed DESC limit 0, 15

Statt mir jetzt eine Zeile auszugeben, in der bei numreplies 2 steht, gibt er mir 2mal die gleiche zeile aus mit jeweils numreplies 1...

das ist aber leider nicht das was ich brauche... was mach ich hier falsch?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Statt mir jetzt eine Zeile auszugeben, in der bei numreplies 2 steht, gibt er mir 2mal die gleiche zeile aus mit jeweils numreplies 1...

das ist aber leider nicht das was ich brauche... was mach ich hier falsch?

Ein Join liefert anhand der Art der Verknüpfung die Datensätze, d.h. wenn Du eine 1:N Verbindung hast, dann können logischerweise mehrere Ergebnisse geliefert werden.

Es ist die Frage woher mehrfache Datensätze kommen, aus der Subquery, was eigentlich das Group ausschließen sollte, sofern p2.id unique ist oder aus dem left join, was wahrscheinlicher ist.

Ein Tipp für Fragen nach Querys: Poste immer zu dem Query was es inhaltlich bedeuten soll, Tabellenstruktur und evtl ein paar Beispieldatensätze. Meisten kann man das Query anders formulieren, so dass es ein korrektes Ergebnis liefert. Im Moment kann man nur auf Deinen Querys herum raten

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...