Axel Richter: mysql: abfrage-optimierung mit joins?

Beitrag lesen

Hallo,

ich hoffe ihr könnt mir einem tip zur optimierung meiner mysql-abfrage in puncto joins geben. folgende tabellen:

tab_name
id_name name
1       xxx
2       yyy
3       zzz
4       xxx

tab_werte
id wert
1  11
1  12
2  13
3  12
3  11
3  10
4  13

tab_wert_name
wert_id wert_name
10      abc
11      def
12      ghi
13      jkl

wie bestimme ich die anzahl von "wert" des namens "xxx"?

SELECT wert_name, COUNT(wert) FROM tab_name, tab_werte, tab_wert_name WHERE wert_id = wert AND id_name = id AND name = "xxx"

Was erwartest Du hier als Ergebnis für wert_name und COUNT(wert)? Die Abfrage ist nämlich syntaktisch falsch, weil eine Aggregatfunktion eine Gruppierung benötigt. MySQL erlaubt das trotzdem, bringt allerdings keine _eindeutigen_ Ergebnisse. Der Nutzer xxx hat:
wert_name   wert
def         11
ghi         12
jkl         13
Soll count jetzt 3 bringen? Welchen Wert soll dann wert_name haben?

Korrekte Syntax wäre:

SELECT Count(tab_werte.wert) FROM tab_name INNER JOIN (tab_werte INNER JOIN tab_wert_name ON tab_werte.wert = tab_wert_name.wert_id) ON tab_name.id_name = tab_werte.id
GROUP BY tab_name.name HAVING tab_name.name="xxx";

Die Performance hängt allerdings hauptsächlich von den Indexen ab. Hier wären welche auf tab_werte.id, tab_werte.wert, tab_name.id_name, tab_name.name und tab_wert_name.wert_id wirksam.

viele Grüße

Axel