# MySQL-Query: SELECT + LEFT JOIN etc.



## MiLa (29. Juli 2004)

HalliHallo,
ja auch ich melde mich mal wieder mit einer "kleinen" Frage!
Ich bin mir zwar grade etwas unsicher, ob das im PHP oder im mySQL Forum richtig aufgehoben ist, ich poste es einfach mal hier...

Ich bin grade dabei meine mySQL-Statements ein wenig aufzuräumen, dabei bin ich auf ein Problem gestoßen, welches ich nicht bewältigen kann.

Also hier erstmal der Query:

```
$query=mysql_query("
SELECT flagg.link AS link, rang.name AS rang, comm.lang AS lang, comm.status AS status, comm.nick AS nick,comm.id AS id,comm.vorname AS vorname,comm.mail AS mail
FROM comm
LEFT JOIN rang
ON comm.rang = rang.id AND rang.id_2='".$_id."'

LEFT JOIN flagg
ON '[flag]comm.lang[/flag]' LIKE flagg.name AND rang.id_2='".$_id."'

WHERE comm.id_2='".$_id."' AND comm.team LIKE '%".$data1['id']."%'
ORDER BY rang
DESC");
```
Soweit so gut...das Problem an der ganzen Sache liegt jetzt hier:

```
'[flag]comm.lang[/flag]'
```
Ich möchte dort alle Dinge herausfiltern wo der Wert flagg.name wie der Wert des Feldes comm.lang ist, allerdings soll der Wert comm.lang vor der Überprüfung immer ein [flag] davor und ein [/flag] dahinter angehängt bekommen.
Nur weiss ich nicht, wie ich das in mySQL syntaktisch richtig schreibe...
Bei PHP hätte ich es jetzt so gelößt:

```
'[flag]'.$lang.'[/flag]'
```
Nur funktioniert das in mySQL nicht so wirklich ;-)

Ich habe es wirklich nirgends gefunden - vieleicht hab ich ja auch nur falsch gesucht...

Danke im Vorraus!


----------



## German (29. Juli 2004)

Aus Deiner Query werd ich jetzt net ganz schlau ...


> *Ich habe es wirklich nirgends gefunden - vieleicht hab ich ja auch nur falsch gesucht...*


... kleine Suchhilfe:
http://dev.mysql.com/doc/mysql/de/String_functions.html

... und speziell dafür 


> *'[flag]comm.lang[/flag]'*


gibts das:

```
CONCAT( '[flag]', 'comm.lang', '[/flag]' )
```

BTW Ist 'rang' eine *eindeutige Spalte*


----------



## MiLa (30. Juli 2004)

Oh..grade gesehen in dem Query sind noch nen paar andere Fehler *hups*
Hm, ich bin bisher noch nicht so bewandert in Sachen mySQL...aber man arbeitet dran ;-)

Super...die Seite hilft mir entscheidend weiter...
Und auch die Funktion CONCAT höert sich recht passend an...

Super...es funktioniert! Danke! 

So, wo wir grade dabei sind, kann ich hier ja noch einen weiteren anzetteln:


```
SELECT teams.name AS name, teams.id AS id, teams.game AS game, REPLACE(games.bild,'../','') AS g_bild, games.name AS g_name, COUNT(*) AS members
FROM teams
LEFT JOIN games
ON teams.game = games.id AND games.id_2='".$_id."'
LEFT JOIN comm
ON comm.team LIKE '%teams.id%'
WHERE teams.active='1' && teams.id_2='".$_id."'
GROUP BY teams.id
ORDER BY teams.displayorder
```

Mein Problem hierbei ist, dass ich die Anzahl der Member in den jeweiligen Teams in 'members' haben möchte...
Nur leider gibt er mir bisher immer die Anzahl der Einträge in der Tabelle comm zurück.
Ist bestimmt mal wieder irgendwo ein klitzefitzelkleiner Denkfehler...


Achja...rang ist keien eindeutige Spalte...sollte sie es sein?


----------



## KoMtuR (30. Juli 2004)

```
SELECT teams.name, teams.id, teams.game AS game, REPLACE(games.bild,'../','') AS g_bild, games.name AS g_name, COUNT(*) AS members
FROM teams
LEFT JOIN games
ON game = games.id AND games.id_2='".$_id."'
LEFT JOIN comm
ON comm.team LIKE '%teams.id%'
WHERE teams.active='1' && teams.id_2='".$_id."'
GROUP BY comm.team
ORDER BY teams.displayorder
```

So ich hoff es funktioniert. Ich habe mal die "AS"-Sachen rausgemacht, die du nicht in der Anweisung brauchst. 
Du kannst zum Beispiel "teams.name" bei Verwendung von mysql_fetch_array auch über 'name' ansprechen. Deswegen brauchst du das "AS name" nicht 

Und mit dem COUNT musst du mal schauen. Müsst aber gehen.

edit: Wo stehen denn deine ganzen Spieler drin? In welcher Tabelle Hab gerade nochmal alles nachgelesen und ich würde dir ja nur die Anzahl der Teams ausgeben 

edit: das mit COUNT ... GROUP BY ist immer so ne Sache iwe ich gerade sehe. Versuche das mal. Hoffe das klappt nun. Hab mal das Group by geändert


----------



## MiLa (30. Juli 2004)

Danke erstmal, aber bei deiner Vertsion bekomme ich ne kleine Fehlermeldung:

```
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '*) AS members FROM teams LEFT JOIN games (#1064)
```

Die  User (Member) stehen un der Tabelle comm...


----------



## KoMtuR (30. Juli 2004)

Hatte das Query nochmal verändert. Hast du mal geschaut ob es geht

Ist ja nur das Group By verändert und den Müll beim Count wieder weg gemacht


----------



## MiLa (30. Juli 2004)

Hm, da zählt er nun die Teams...also irgendwas ist auch da nicht richtig...
Ich glaub ich sollt mir langsam echt mal nen mySQL Buch zulegen *gg*

Also vieleicht hilft dir das ja: in comm.team steht: für jedes Team in dem der User ist eine id und als Trennzeichen ein |. z.b. 6|3|2


----------



## KoMtuR (30. Juli 2004)

Hmm ist immer so ne Sache  Ich finde ein Query mit Group By ziemlich sch...  Hab mich damit auch noch nicht genügend beschäftigt. Ich werd mir mal ne Tabelle anlegen und das mit GROUP By testen


----------



## MiLa (30. Juli 2004)

Ich würds ja gerne so zählen, aber der COUNT da verlangt nen GROUP BY...

Also wenn du ne andere Möglichkeit weisst innerhalb dieses Statements die Einträge aus comm zu zählen die die ID des Teams im Feld team stehen haben...


----------



## KoMtuR (30. Juli 2004)

Also dein Query liest die User eines Team aus oder? Ich bastel nämlich gerade 

Also am Ende werden nur die members eines Teams ausgegeben oder? So wie ich das Query verstehe


----------



## MiLa (30. Juli 2004)

http://code.larsmichelsen.de/index.php?go=team

Gucks dir doch selber an... 
In PHP mit numrows ist das kein Problem, aber grade solche Dinge versuche ich abzulösen...


----------



## KoMtuR (30. Juli 2004)

Also das Problem meiner Ansicht nach ist einfach, dass du mit Count und GROUP BY nicht arbeiten kannst, weil du eben keine gleichen Spalteninhalte hast. Somit gibt er kein Count aus. Du könntest nur eine zusätzliche Tabelle machen, wo die User-Ids mit den Team-ids stehen und das kannste dann per COUNT machen.

Bsp:

id uid team_id
1 1 1
2 1 2
3 2 3
4 2 4
5 2 1


----------



## MiLa (30. Juli 2004)

Boae...nae, grade sowas wollte ich vermeiden...hm...
geht nich soetwas wie GROUP BY '%team.id%'?


----------



## KoMtuR (30. Juli 2004)

Boah da überfragst du mich jetzt. Ist das erste mal, dass ich mich mit GROOUP BY beschäftige. Habs immer ganz weit hinten in der TODO-Liste gehabt 

Aber ich glaube es geht nicht. probiers doch einfach aus 

Leider ist phpMyAdmin noch nicht so nutzerfreundlich gemacht, dass man mit Schaltflächen sein eigenes Query machen. So mit Button "LEFT JOIN" und gleich das Resultat dazu


----------



## MiLa (30. Juli 2004)

*gg* das wärs...

Na gut, denn werde ich mal weiter forschen, kann doch nicht soooo schweer sein!


----------

