MySQL-Problem

D

deluxe89

Guest
Hi,
ich habe eine Tutorial-Datenbank programmiert. Nun möchte ich eine Statistik mit
den Top Postern erstellen.

CODE
SELECT
users.ID,
users.name,
COUNT(tutorials.ID) AS num_tutorials
FROM
users,
tutorials
WHERE
users.ID = tutorials.posterID
GROUP BY
users.ID
ORDER BY
num_tutorials DESC,
users.name ASC;



Das Problem dieses Queries ist, dass er Benutzer mit keinen Tutorials nicht
ausliest. Wie würdet ihr das Problem lösen?


THX im Voraus!

deluxe
 
Ich benutz zwar kein MySQL, aber ich denke, so müsste es gehen:

SELECT users.ID, users.name, COUNT(tutorials.ID) AS num_tutorials
FROM users, tutorials
WHERE (users.ID = tutorials.posterID) or (tutorials.posterID is null)
GROUP BY users.ID
ORDER BY num_tutorials DESC, users.name ASC;

Wenn Du die Verknüpfung zwischen zwei Tabellen machst, werden automatisch alle Records herausgefiltert, die in einer der Tabellen keine Entsprechung haben. Mit dem "is null" werden auch diese Records berücksichtigt. Das Feld num_tutorials hat im Resultat bei den Usern, die keine Tutorials haben, halt einfach null.

Griessli
Irene
 
Leider funktioniert der Query auch nicht. Es werden, wie zuvor, nur Benutzer
mit mindestens einem Tutorial ausgelesen.

In PHPMyAdmin steht bei dem posterID Feld:
NULL : yes
DEFAULT: NULL


Müsste also eigentlich klappen...
Wisst ihr, woran es liegt?

deluxe
 
versuchs mal mit nem join:

CODE SELECT
a.id
,a.name
count(b.id) AS num_tutorials
FROM
users a
JOIN
tutorials b ON a.ID = b.postID
GROUP BY
a.ID
ORDER BY
num_tutorials ASC
,a.name DESC

wenns nicht klappt, streich unnötige ORDER BY oder GROUP BY raus um zu sehen, obs dann klappt. sonst gib mal n sql-dump, damit ich das lokal testen könnte.

gruss
j0sh
 
QUOTE Es werden, wie zuvor, nur Benutzer
mit mindestens einem Tutorial ausgelesen.

nun, ich denke mal, mysql stört es, wenn 0 einträge gefunden werden und ignoriert dies. gib mal sql dump, vielleicht find ichs so raus.
 
Hi j0sh,
dein Query liest auch nur das gleiche aus
wink.gif

Wegen einem MySQL-Dump... Ist schwierig, da in der Datenbank
auch nicht öffentliche Informationen drinstehen.

Langsam nervt mich das Prob
blink.gif



Danke für eure Antworten!

deluxe
 
dann mach einen dump der struktur und füge ein paar fake-datensätze ein, wenn du mir nicht vertraust.
rolleyes.gif
 
CODE WHERE (users.ID = tutorials.posterID) or (tutorials.posterID is null)
Das wird nicht gehen, weil wenn ein User kein Tutorial geschrieben hat, da einfach kein Datensatz in der Tabelle sein wird. Kein Datensatz ist nicht mit NULL auslesbar.

Spontan fällt mir hier nur UNION ein. Das Vorgehen wäre dann: mit ersten Select alle auslesen, die was geschrieben haben, das 2. holt alle anderen raus und mittels UNION werden die beiden Resultsets verbunden.
Aber das wird erst in neueren mysql Versionen unterstützt. Welche mysql Version hast du denn auf dem Server ?

Vielleicht ginge es auch mit JOINS, da gibt es ja verschiedene Typen. Da ich diese aber immer verwechsle
dry.gif
, empfehle ich dir, diese schnell selber zu studieren.

Gruss
Roger
 
QUOTE Vielleicht ginge es auch mit JOINS, da gibt es ja verschiedene Typen. Da ich diese aber immer verwechsle , empfehle ich dir, diese schnell selber zu studieren.


genau, schieb beim join mal ein "OUTER" vorne ran, dann probier's noch mit "LEFT" und "RIGHT". könnte funktionieren, könnte dann aber auch ungewollt viele datensätze ausspucken...
 
Hi,
mit LEFT JOIN funktioniert es nun. Könnt ihr mir erklären, wie es funktioniert, da
die MySQL-Manual nicht sehr viel hergibt.

Wäre nett.

deluxe
 
Zurück
Oben