Suchen
Inside Forum
Nützliche Links




 
phpforum.de bei Facebook
 
phpforum.de bei Twitter
 

Zurück   PHP Forum: phpforum.de > Datenbanken > Datenbanken

Datenbanken Alles rund um MySQL, MariaDB, PostgreSQL o.ä. und die NoSQL-Datenbanken

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 27.03.2018, 11:40
SuperMarioTM SuperMarioTM ist offline
Engagierter Besucher
 
Registriert seit: 26.10.2011
Ort: Wien
Beiträge: 354
Standard Multi JOINS und MultiI ON

Hallo, seid bitte gnädig ich bin am lernen und verstehen:
Medaillen/Erfolge der Nationen sichere ich in "erfolge".

Einzelmedaillen der Athleten kann ich sehr einfach summieren und ausgeben mit
SQL Quellcode:
SELECT
  CONCAT(a.vorname," ", a.nachname) AS bez,
  COUNT(CASE WHEN e.medaille = 1 THEN e.medaille ELSE NULL END) AS g,
  COUNT(CASE WHEN e.medaille = 2 THEN e.medaille ELSE NULL END) AS s,
  COUNT(CASE WHEN e.medaille = 3 THEN e.medaille ELSE NULL END) AS b,
  COUNT(e.medaille) AS ges,
    GROUP_CONCAT(e.id SEPARATOR ", " ) erfolgIds
   
FROM athleten a
LEFT JOIN erfolge e ON(e.athlet = a.id )
     
GROUP BY a.id
ORDER BY ges DESC, bez ASC
LIMIT 20

Beispiel Phelps:
Michael Phelps, 13,2,1,16,{243,816,559,...} [Name, Gold, Silber, Bronze, Gesamt,{erfolg ids für später}]

Jetzt möchte ich gerne verstehen wie ich es angehen soll die Teammedaillen dazu zu werten wenn der athlet mit dem team eine medaille gewonnen hat. Habe es schon mit dem versucht:
SQL Quellcode:
SELECT
  CONCAT(a.vorname," ", a.nachname) AS bez,
  COUNT(CASE WHEN e.medaille = 1 THEN e.medaille ELSE NULL END) AS g,
  COUNT(CASE WHEN e.medaille = 2 THEN e.medaille ELSE NULL END) AS s,
  COUNT(CASE WHEN e.medaille = 3 THEN e.medaille ELSE NULL END) AS b,
  COUNT(e.medaille) AS ges,
    GROUP_CONCAT(e.id SEPARATOR ", " ) erfolgIds
   
FROM athleten a
INNER JOIN team_athleten ta ON(a.id = ta.athlet)
INNER JOIN teams t ON(ta.team = t.id)
LEFT JOIN erfolge e ON(e.athlet = a.id OR e.team = t.id)
     
GROUP BY a.id
ORDER BY ges DESC, bez ASC
LIMIT 20


Nun ich bin für jede konstruktive Hilfe dankbar.
__________________
It doesn't hurt to ask!
Mit Zitat antworten
  #2  
Alt 27.03.2018, 12:45
SuperMarioTM SuperMarioTM ist offline
Engagierter Besucher
 
Registriert seit: 26.10.2011
Ort: Wien
Beiträge: 354
Standard AW: Multi JOINS und MultiI ON

Bin schon einen Schritt weiter gekommen:
SQL Quellcode:
SELECT
  CONCAT(a.vorname," ", a.nachname) AS bez,
  COUNT(CASE WHEN e.medaille = 1 THEN e.medaille ELSE NULL END) AS g,
  COUNT(CASE WHEN e.medaille = 2 THEN e.medaille ELSE NULL END) AS s,
  COUNT(CASE WHEN e.medaille = 3 THEN e.medaille ELSE NULL END) AS b,
  COUNT(e.medaille) AS ges,
    GROUP_CONCAT(e.id SEPARATOR ", " ) erfolgIds

FROM athleten a
LEFT JOIN erfolge e ON(
    e.athlet = a.id
    OR
    e.team IN(
        SELECT t.id
        FROM team_athleten ta
        INNER JOIN teams t ON t.id = ta.team
        WHERE ta.athlet = a.id
  )
)
WHERE a.id = 7964
GROUP BY a.id
ORDER BY ges DESC, bez ASC
Damit habe ich die Tabellen kombiniert und das funktioniert. super.
WENN ich jetzt allerdings das WHERE weg gebe und ein LIMIT anhänge, dann lädt mein Mysql Server ewig und bringt mir keine Ergebnisse:
SQL Quellcode:
SELECT
  CONCAT(a.vorname," ", a.nachname) AS bez,
  COUNT(CASE WHEN e.medaille = 1 THEN e.medaille ELSE NULL END) AS g,
  COUNT(CASE WHEN e.medaille = 2 THEN e.medaille ELSE NULL END) AS s,
  COUNT(CASE WHEN e.medaille = 3 THEN e.medaille ELSE NULL END) AS b,
  COUNT(e.medaille) AS ges,
    GROUP_CONCAT(e.id SEPARATOR ", " ) erfolgIds

FROM athleten a
LEFT JOIN erfolge e ON(
    e.athlet = a.id
    OR
    e.team IN(
        SELECT t.id
        FROM team_athleten ta
        INNER JOIN teams t ON t.id = ta.team
        WHERE ta.athlet = a.id
  )
)
GROUP BY a.id
ORDER BY ges DESC, bez ASC
LIMIT 10

An was könnte das jetzt noch liegen? Perormance??? Habe 28585 Athleten
__________________
It doesn't hurt to ask!
Mit Zitat antworten
  #3  
Alt 27.03.2018, 18:08
Jens Clasen Jens Clasen ist offline
Vorbildlicher Helfer
 
Registriert seit: 12.02.2005
Beiträge: 14.719
Standard AW: Multi JOINS und MultiI ON

Kurzfassung: MySQL mag keine abhängigen Subselects. Oder anders gesagt: Für jeden Athleten, der nicht zumindest einmal als Erfolg auftaucht, muss Deine Unterabfrage einmal ausgeführt werden. Das erweist sich zu als zu aufwändig. Vermutlich verschlimmert sich das Problem noch aufgrund fehlender Indizes. Explain erklärt Dir das sicher gerne.

Ich würde aber an Deiner Stelle grundsätzlich anders vorgehen, nämlich so:

SQL Quellcode:
SELECT
  CONCAT(a.vorname," ", a.nachname) AS bez,
  COUNT(CASE WHEN e.medaille = 1 THEN e.medaille ELSE NULL END) AS g,
  COUNT(CASE WHEN e.medaille = 2 THEN e.medaille ELSE NULL END) AS s,
  COUNT(CASE WHEN e.medaille = 3 THEN e.medaille ELSE NULL END) AS b,
  COUNT(e.medaille) AS ges,
    GROUP_CONCAT(e.id SEPARATOR ", " ) erfolgIds
   
FROM athleten a
LEFT JOIN team_athleten ta ON(a.id = ta.athlet)
LEFT JOIN erfolge e ON(e.athlet = a.id OR e.team = ta.team)
GROUP BY a.id
ORDER BY ges DESC, bez ASC
LIMIT 20


Dazu empfehle ich Indizes auf team_athleten.athlet, erfolge.athlet und erfolge.team. (Sowie natürlich auf athleten.id)

Problematisch wird das nur, wenn ein Athlet in mehreren Teams sein kann. Dann würden hier ggf. Einzelergebnisse doppelt gezählt. Ggf. kann man auch noch hinterfragen, ob erfolge.team bei Einzelerfolgen ggf. NULL ist. Sollte dem so sein, würde ich das in der ON-Klausel des Joins auf Erfolge ggf. noch einbauen.

Gruß Jens
__________________
Schleichwerbung I - Schleichwerbung II
Mit Zitat antworten
  #4  
Alt 27.03.2018, 18:19
SuperMarioTM SuperMarioTM ist offline
Engagierter Besucher
 
Registriert seit: 26.10.2011
Ort: Wien
Beiträge: 354
Standard AW: Multi JOINS und MultiI ON

Die Indizes sind soweit alle gesetzt.
JA, erfolge.team ist NULL wenn es ein Einzelerfolg ist.
wie baue ich das beim ON auf Erfolge ein?
Dankeschön
__________________
It doesn't hurt to ask!
Mit Zitat antworten


Antwort

Lesezeichen

Themen-Optionen
Ansicht

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

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu
Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
multi query fehlendesx PHP 6 30.05.2012 17:18
Joins Frokuss Datenbanken 13 19.10.2009 15:30
Joins Kasalop Datenbanken 2 20.06.2009 19:29
Sql-joins Robert_Berlin Datenbanken 3 24.01.2007 14:08
sql joins blackhawk3000 Datenbanken 1 29.03.2006 19:15


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


Powered by vBulletin® Version 3.8.8 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Powered by NuWiki v1.3 RC1 Copyright ©2006-2007, NuHit, LLC