Startseite
Stellenmarkt
Downloads
Kontakt
  Community Center:   Forum  |  Gruppen  |  Chat  |

Zurück   Forum Fachinformatiker.de > Fachliches > Datenbanken



Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 12.03.2010, 21:13   #1
Zugriff eingeschränkt, e-Mailadresse ungültig
 
Reg.-Datum: 05.06.2006
Standard Datenbankprobleme

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?

Code:
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)
flipse ist offline   Mit Zitat antworten
Alt 12.03.2010, 21:57   #2
Moderator Java
 
Reg.-Datum: 24.07.2007
Ort: auf nem Berg
Standard

Welches DBMS?
Und was heißt "funktioniert nicht" !?

Bitte das Problem präzise beschreiben!
__________________
In attempting to construct such machines we should not be irreverently usurping His power of creating souls, any more than we are in the procreation of children: rather we are, in either case, instruments of His will providing mansions for the souls that He creates. (Alan Turing)
flashpixx ist gerade online   Mit Zitat antworten
Alt 12.03.2010, 22:07   #3
Zugriff eingeschränkt, e-Mailadresse ungültig
 
Reg.-Datum: 05.06.2006
Standard

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
flipse ist offline   Mit Zitat antworten
Alt 12.03.2010, 23:16   #4
Moderator Java
 
Reg.-Datum: 24.07.2007
Ort: auf nem Berg
Standard

Zitat:
Zitat von flipse Beitrag anzeigen
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

Zitat:
Zitat von flipse Beitrag anzeigen
Außerdem hätte ich es gerne, dass statt NULL 0 ausgegeben wird
MySQL :: MySQL 5.1 Referenzhandbuch :: 12.2 Ablaufsteuerungsfunktionen
__________________
In attempting to construct such machines we should not be irreverently usurping His power of creating souls, any more than we are in the procreation of children: rather we are, in either case, instruments of His will providing mansions for the souls that He creates. (Alan Turing)
flashpixx ist gerade online   Mit Zitat antworten
Alt 13.03.2010, 07:21   #5
Zugriff eingeschränkt, e-Mailadresse ungültig
 
Reg.-Datum: 05.06.2006
Standard

super.
ich hab jetzt null erlaubt und es funktioniert. cool...danke dir.
flipse ist offline   Mit Zitat antworten
Alt 13.03.2010, 07:28   #6
Zugriff eingeschränkt, e-Mailadresse ungültig
 
Reg.-Datum: 05.06.2006
Standard

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
flipse ist offline   Mit Zitat antworten
Alt 13.03.2010, 07:37   #7
Zugriff eingeschränkt, e-Mailadresse ungültig
 
Reg.-Datum: 05.06.2006
Standard

ok jetzt funktionierts... supii
flipse ist offline   Mit Zitat antworten
Alt 13.03.2010, 07:54   #8
Zugriff eingeschränkt, e-Mailadresse ungültig
 
Reg.-Datum: 05.06.2006
Standard

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?
flipse ist offline   Mit Zitat antworten
Alt 13.03.2010, 10:40   #9
Moderator Java
 
Reg.-Datum: 24.07.2007
Ort: auf nem Berg
Standard

Zitat:
Zitat von flipse Beitrag anzeigen
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
__________________
In attempting to construct such machines we should not be irreverently usurping His power of creating souls, any more than we are in the procreation of children: rather we are, in either case, instruments of His will providing mansions for the souls that He creates. (Alan Turing)
flashpixx ist gerade online   Mit Zitat antworten