select statement gesucht

select statement gesucht

am 02.03.2006 19:38:17 von Florian Kornhoffer

Hallo,


ich habe folgendes SELECT

SELECT k.nummer, count( b.wen ) AS anzahl
FROM ek_kunden k LEFT OUTER JOIN ek_bewertung b ON k.nummer = b.wen
WHERE k.dabei = "Y"
GROUP BY k.nummer
ORDER BY anzahl DESC, k.nummer

Das funktioniert soweit - jetzt sollte noch eine Info aus einer dritten
Tabelle dazu und zwar der letzte loginzeit Punkt eines beliebigen Users
zum Kunden:

SELECT k.nummer, count( b.wen ) AS anzahl, MAX( u.lastlogin ) AS
lastlogin
FROM ek_kunden k LEFT OUTER JOIN ek_bewertung b ON k.nummer = b.wen,
ek_user u
WHERE k.dabei = "Y"
AND k.nummer = u.kunde
GROUP BY k.nummer
ORDER BY anzahl DESC , k.nummer

Das Ergebnis paßt eigentlich - Problem ist aber: hat ein Kunde mehr als
einen User ist anzahl = anzahl * userzahl

Setze ich in group by noch ein ',u.user_id', stimmt zwar die Anzahl aber
ich bekomme je einen Satz pro User.

Wie geht's richtig? Habe leider nur MySQL 4.0.23 zur Verfügung, so dass
einen subquery nicht funktioniert.


Danke
Florian

Re: select statement gesucht

am 02.03.2006 21:18:15 von Thomas Rachel

Florian Kornhoffer wrote:

> Hallo,
>
>
> ich habe folgendes SELECT
>
> SELECT k.nummer, count( b.wen ) AS anzahl
> FROM ek_kunden k LEFT OUTER JOIN ek_bewertung b ON k.nummer = b.wen
> WHERE k.dabei = "Y"
> GROUP BY k.nummer
> ORDER BY anzahl DESC, k.nummer

Sehr unübersichtlich. Vermutlich zwar historisch gewachsen, aber dennoch ist
die Kombination k.nummer, b.wen und u.kunde nur schwer nachvollziehbar.
Wäre besser, wenn sie bspw. alle kunde heißen würden...

> Das Ergebnis paßt eigentlich - Problem ist aber: hat ein Kunde mehr als
> einen User ist anzahl = anzahl * userzahl

Was willst Du mir damit sagen? Was hättest Du gerne? Die Gesamtanzahl oder
die Zahl pro Kunde?


Du willst die Anzahl der Bewertungen pro Kunde, gepaart mit der letzten
Login-Zeit irgendeines seiner User?


grübel

Ich glaube, Du suchst folgendes:

SELECT
k.nummer,
count( b.wen ) AS anzahl,
MAX( u.lastlogin ) AS lastlogin
FROM ek_kunden k
LEFT OUTER JOIN ek_bewertung b ON k.nummer = b.wen
LEFT JOIN ek_user u ON k.nummer = u.kunde
LEFT JOIN ek_user s ON k.nummer=s.kunde and s.lastlogin>u.lastlogin
WHERE k.dabei = 'Y'
AND s.lastlogin is null /* AND u.lastlogin is not null */
GROUP BY k.nummer
ORDER BY anzahl DESC , k.nummer

Kurze Erläuterung: Die Tabelle s (steht für "später" :-) ) dient dazu, quasi
immer um einen Eintrag zu spät zu sein: die Bedingung s.lastlogin is null
stellt dies im Zusammenhang mit der Join-Bedingung s.lastlogin>u.lastlogin
sicher.

Dadurch erhalte ich mit s eine einzige Zeile pro Kunde, gefüllt mit
NULL-Werten (dank des LEFT JOIN und des ON k.nummer=s.kunde).

HTH,

Thomas

Re: select statement gesucht

am 02.03.2006 21:46:50 von Christian Kirsch

Florian Kornhoffer wrote:

>und zwar der letzte loginzeit Punkt

Manchmal wünsche ich mir einen NNTP-Server, der ein Posting einfach mit
"Syntax error" abweist. So wie ja auch C-Compiler und SQL-Server
fehlerhafte Statements einfach mit einer Fehlermeldung quittieren.

Re: select statement gesucht

am 03.03.2006 08:10:20 von Florian Kornhoffer

Thomas Rachel schrieb:

> Sehr unübersichtlich. Vermutlich zwar historisch gewachsen
korrekt

>> Das Ergebnis paßt eigentlich - Problem ist aber: hat ein Kunde mehr als
>> einen User ist anzahl = anzahl * userzahl
>
> Was willst Du mir damit sagen? Was hättest Du gerne? Die Gesamtanzahl oder
> die Zahl pro Kunde?
>
>
> Du willst die Anzahl der Bewertungen pro Kunde, gepaart mit der letzten
> Login-Zeit irgendeines seiner User?
>

gute Kristallkugel - sorry - ich dachte es war über die ursprüngliche
Abfrage mit der gewünschten Änderung dazu klar genug formuliert.

> SELECT
> k.nummer,
> count( b.wen ) AS anzahl,
> MAX( u.lastlogin ) AS lastlogin
> FROM ek_kunden k
> LEFT OUTER JOIN ek_bewertung b ON k.nummer = b.wen
> LEFT JOIN ek_user u ON k.nummer = u.kunde
> LEFT JOIN ek_user s ON k.nummer=s.kunde and s.lastlogin>u.lastlogin
> WHERE k.dabei = 'Y'
> AND s.lastlogin is null /* AND u.lastlogin is not null */
> GROUP BY k.nummer
> ORDER BY anzahl DESC , k.nummer

Ehrlich gesagt ich habe es nicht ganz verstanden. Habee saber trotzdem
mal versucht aus phpMyAdmin heraus laufen zu lassen (es war übrigens ein
SET MYSQL_BIG_SELECT=1 notwendig). Allerdings kam länger keine Reaktion
mehr.

Ein Blick in die Processlist zeigte, dass mysql seit gut 5 Minuten mit
dem kopieren in eine tmp Tabelle beschäftigt ist. Dabei wird aber die
User-Tabelle komplett gelockt, was wiederum verhindert, dass sich einer
anmelden kann. Daher habe ich den Prozess dann abgebrochen.

Fällt Dir sonst noch was ein? Ansonsten werde ich wohl das Problem über
eine temp. Tabelle, die in zwei Schritten gefüllt wird losen müssen.

Danke
Florian