php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 02.11.2011, 15:48  
Neuer Benutzer
 
Registriert seit: 09.12.2008
Beiträge: 8
red-head befindet sich auf einem aufstrebenden Ast
Standard Join auf einen Wertebereich der 3. Tabelle

Hallo liebe PHP Gemeinde!

Ich habe ein kleines MySQL Problem, dessen Lösung mich schon einige Tage nicht loslässt. Leider bin ich mit meinem Latein so ziemlich am Ende.

Mein Vorhaben:
Ich habe 3 Tabellen, die ich per Join abfrage.
- Inhalt von Tabelle 1: Benutzerdaten
- Inhalt von Tabelle 2: Kommentare der Benutzer
- Inhalt von Tabelle 3: Eine Rangtabelle

Nun habe ich vor aus Tabelle 1 und 2 eine Abfrage mit einem count() der Beiträge der jeweiligen Benutzer zu machen und Tabelle 3 entsprechend nach dem vom Benutzer erreichten Rang abzufragen. Geht das eigentlich in einer Abfrage?

Tabelle 1 und 2 ist ja kein Problem:
Code:
select 
    u.name
    ,count(k.kommentar) as kommentare
from tbl1 as u
    inner join tbl2 as k
    on u.id = k.user_id
group by u.id
Tabelle 3 hat folgende Spalten:
`von` <-- Mindestanzahl an Kommentaren eines Ranges
`bis` <-- Höchstanzahl an Kommentaren eines Ranges
`rang`<-- Name des Ranges

Ich habe einiges versucht (leider bekomme ich mein Statementdurcheinander nicht mehr rekonstruiert). Meine letzte Idee, die mir am geeignetsten schien war folgende:

Code:
select 
    u.name
    ,count(k.kommentar) as kommentare
from tbl1 as u
    inner join tbl2 as k
    on u.id = k.user_id
       inner join tbl3 as r
       on count(k.kommentar) >= r.von and count(k.kommentar) <= r.bis
group by u.id
Ich versuche also das Ergebnis aus dem count() auf einen Bereich der Spalten `von` und `bis` zu beziehen. Leider schlägt explizit dieses Beispiel mit der Meldung Invalid use of group function fehl.

Beim Ersetzen von count(k.kommentar) durch den Alias kommentare im Join auf tbl3 bekomme ich Unknown column 'kommentare' in 'on clause'.

Kann mir jemand von euch vielleicht ein bisschen auf die Sprünge helfen?
red-head ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 02.11.2011, 16:26  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

fangen wir mal "hinten" an - dein Alias "kommentare" existiert erst, wenn die komplette Abfrage erfolgreich behandelt wurde und die Ergebnisse zurückgeliefert werden - deshalb darfst du dich im Where - das ja noch während des Auswürfelns der Ergebnisse bearbeitet wird - nicht auf den Alias beziehen - den gibts da noch gar nicht

Und zum anderen - ich glaub dein group auf die u.id ist unnötig dort ....

für deinen Zweck würde ich im Select Teil noch die Spalte "Rang" der 3ten Tabelle mit angeben und statt der Join-On Klausel eben eine richtige Where Bedingung setzen

Code:
select 
    u.name
    ,count(k.kommentar) as kommentare, r.Rang as Rang 
from tbl1 as u, tbl3 as r 
    inner join tbl2 as k
    on u.id = k.user_id
       where count(k.kommentar) >= r.von and count(k.kommentar) <= r.bis
- ungetestet
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 02.11.2011, 16:48  
Erfahrener Benutzer
 
Benutzerbild von Dark Guardian
 
Registriert seit: 10.10.2009
Beiträge: 2.628
PHP-Kenntnisse:
Fortgeschritten
Dark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekannt
Standard

Code:
       WHERE count(k.kommentar) BETWEEN r.von AND r.bis
Ein wenig hübscher

Der GROUP BY ist nötig, da er für jeden User die Anzahl Kommentare haben will. Wenn 5 Kommentare auf den User gejoined werden kommt der User auch 5 mal vor und der Count ist für jede Zeile 1.

Du kannst in der On Clause die Gruppenfunktion nicht nutzen weil der GROUP BY hier noch nicht durchgeführt wurde.

Ich bin fast überzeugt das du hier tatsächlich auf einen Subselect gehen müsstest ...

Edit:

Try this:
Code:
SELECT
    u.name
    ,count(k.kommentar) AS kommentare
    ,r.rang
FROM tbl3 r, tbl1 u
    INNER JOIN tbl2 k
    ON u.id = k.user_id
GROUP BY u.id
HAVING count(k.kommentar) BETWEEN r.von AND r.bis
__________________
"Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".

Geändert von Dark Guardian (02.11.2011 um 16:57 Uhr).
Dark Guardian ist offline   Mit Zitat antworten
Alt 06.11.2011, 23:33  
Neuer Benutzer
 
Registriert seit: 09.12.2008
Beiträge: 8
red-head befindet sich auf einem aufstrebenden Ast
Standard

Hallo zusammen!

Erstmal vielen Dank für die Antworten und die damit gegebene Starthilfe in die scheinbar richtige Richtung!

Ich hatte leider erst jetzt Zeit das mal durchzuspielen. Die Lösung von Dark Guardian kommt der Lösung meines Problems am nächsten. Ich musste in der Abfrage nur noch r.von und r.bis mit einbinden, da aufgrund der Abfrage die Fehlermeldung kam, dass die beiden Spalten nicht bekannt waren und anstatt eines inner joins einen left join machen.
Ich habe in der Tabelle für die Ränge ein paar Trainingsdaten hinterlegt, damit ich eine größere Anzahl an Ergenissen bekomme.
Leider bekomme ich immer nur den 1st match, anstatt mehrerer Treffer.

Beispiel:
User a hat 10 Kommentare
User b hat 50 Kommentare
User c hat 100 Kommentare
User d hat 120 Kommentare

In der Rangtabelle (tbl3) sind folgende Bereiche hinterlegt (von - bis --> Rang):
0 - 40 Kommentare --> Neuling
41 - 99 Kommentare --> Erfahrener User
100 - 150 Kommentare --> Experte

Interessanter Weise schmeißt mir mein SQL Client nur den User mit dem dazugehörigen Rang raus, der als Neuling eingestuft wurde.

Ich müsste in dem Join doch erst die User abfragen, bevor ich mich auf die Ränge stürze, oder liege ich falsch?
Dann habe ich aber das Problem, dass ich in der On-Klausel nicht auf die Ränge referenzieren kann.
Sorry, aber ich bekomme echt nen Knoten im Hirn.

Beste -wenn auch verzweifelte- Grüße
red-head
red-head ist offline   Mit Zitat antworten
Alt 08.11.2011, 09:15  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

dann musst du auf das subselect ausweichen, um die Beiträge eines Users zuverlässig zu zählen und erst DANACH in die Ränge-Tabelle zu joinen
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 09.11.2011, 11:05  
Neuer Benutzer
 
Registriert seit: 09.12.2008
Beiträge: 8
red-head befindet sich auf einem aufstrebenden Ast
Standard

Freunde, mir ist nach nem Freudentanz!

Hier meine (endlich) funktionierende Lösung:
Code:
select
	u.user_id
	,u.name
	,u.kommentare
	,r.rang
from
	(
	select x.id as user_id,x.name as name,count(k.kommentar) as kommentare
	from tbl1 as x
		left join tbl2 as k
			on x.id = k.user_id
	group by x.id
	) as u
	left join tbl3 as r
		on u.kommentare BETWEEN r.von and r.bis
Wenn ich da so nochmal drüberschaue, ist das garnicht kompliziert. Kann ein Admin meinen Nick mal in Blackout-User ändern? *schäm*

Mein ewiger Dank sei euch gewiss!
red-head ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Join, Where und Trennzeichen in der Tabelle 141131 PHP Einsteiger 4 11.10.2011 13:45
Probleme mit SQL Query (Join über mehrere Tabellen) smilla Datenbanken 1 04.10.2011 00:09
Design einer DB für mehrsprachigkeit Squall Software-Design 35 08.10.2010 13:09
[Erledigt] Left Join 3 Tabellen mykosch Datenbanken 5 16.09.2010 14:51
Tabelle nach Join sortieren xhiBseN Datenbanken 9 29.03.2010 10:52
[Erledigt] Intertabellarische Berechnungen, wie? dave303 Datenbanken 13 05.03.2010 11:58
[Erledigt] mit einer CHECKBOX feld nach mehreren wörtern durchsuchen taurus Datenbanken 20 01.12.2008 10:49
Wiederholter statt neuer COUNT bei JOIN Greezoo Datenbanken 5 06.07.2007 14:10
[solved] LEFT JOIN - #1066 - Not unique table/alias moose Datenbanken 6 12.12.2006 06:41
[Erledigt] Problem mit mySQL Datenbanken 7 27.09.2005 12:06
[Erledigt] mysql abfrage über 4 Tabelle - bis 3 geht, bei der 4. habert Datenbanken 2 08.09.2005 11:59
Theta Join? Datenbanken 9 26.03.2005 17:28
left outer join Problem Datenbanken 5 21.01.2005 17:25
Join aus 3 Tabellen mit nur einer Verknüpfung? Datenbanken 7 24.09.2004 18:25
2 Werte aus 1 Tabelle mit JOIN? Datenbanken 5 19.08.2004 10:53

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
sql gruppieren und zählen wertebereich, t-sql join mit nähesten wert, sql abfrage wertebereich, php datenbank mindestzahl#, join mit tabelle, sql abfrage wertebereich zählen

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:12 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum