SQL Abfrage Sortieren

Bossi28

Mitglied
Hi Leute,

habe ein kleines Problem.

Ich habe mir eine Sporttabelle erstellt, klappt ja alles wunderbar nur kann ich sie nicht nach Punkten sortieren, da ich die Punkte danach erst zusammenrechne.

PHP:
 $sql= sprintf("SELECT DISTINCT((select count(*) from tabelle where heim_user_id='%u' AND heim_team=heim_user_team
            AND heim_tor>gast_tor AND ergz_status='ended')+(select count(*) from tabelle where heim_user_id='%u' AND ergz_gast_t=heim_user_team
            AND gast_tor>heim_tor AND ergz_status='ended')+(select count(*) from tabelle where gast_user='%u' AND heim_team=gast_team
            AND heim_tor>gast_tor AND ergz_status='ended')+(select count(*) from tabelle where gast_user='%u' AND ergz_gast_t=gast_team
            AND gast_tor>heim_tor AND ergz_status='ended')) as vier from tabelle order by vier",
            mysql_real_escape_string($user),
            mysql_real_escape_string($user),
            mysql_real_escape_string($user),
            mysql_real_escape_string($user));
            $result= mysql_query($sql);
            $datensatz = mysql_fetch_row($result);
            $siege =  $datensatz[0];
            if (!$siege){$siege==0;}
  
              $siegerpunkte = $siege * 3;
  


            $sql= sprintf("SELECT DISTINCT((select count(*) from tabelle where heim_user_id='%u' AND heim_team=heim_user_team
            AND heim_tor=gast_tor AND ergz_status='ended')+(select count(*) from tabelle where heim_user_id='%u' AND ergz_gast_t=heim_user_team
            AND gast_tor=heim_tor AND ergz_status='ended')+(select count(*) from tabelle where gast_user='%u' AND heim_team=gast_team
            AND heim_tor=gast_tor AND ergz_status='ended')+(select count(*) from tabelle where gast_user='%u' AND ergz_gast_t=gast_team
            AND gast_tor=heim_tor AND ergz_status='ended')) as vier from tabelle",
            mysql_real_escape_string($user),
            mysql_real_escape_string($user),
            mysql_real_escape_string($user),
            mysql_real_escape_string($user));
            $result= mysql_query($sql);
            $datensatz = mysql_fetch_row($result);
            $remis = $datensatz[0];
            if (!$remis) {$remis==0;}
            
            $remi = $remis * 1;
            $Punkte =  $siegerpunkte + $remi;
 
SQL:
SELECT *
FROM
    (
        SELECT
            COUNT(*) AS cnt
--Hier der Rest deines SQLs
    ) AS dat
ORDER BY
    cnt
 
Zuletzt bearbeitet von einem Moderator:
Das geht leider nicht.

weil die Abfrage in einer While schleife liegt.

Und alles was ich da Sortiere übernimmt er mir nicht.


PHP:
$sql2= "SELECT DISTINCT COUNT(*) as Anzahl,user_name,user_id from tabelle JOIN user WHERE user_id=ergebnis_heim_id OR user_id=gast_user_id AND ergz_status='ended' group by user_id 
	 ";
		$result2= mysql_query($sql2) or die(mysql_error());
		echo mysql_error();
		
		$counter = 1;
		while ($row = mysql_fetch_array($result2)){


 $sql= sprintf("SELECT DISTINCT((select count(*) from tabelle where heim_user_id='%u' AND heim_team=heim_user_team
            AND heim_tor>gast_tor AND ergz_status='ended')+(select count(*) from tabelle where heim_user_id='%u' AND ergz_gast_t=heim_user_team
            AND gast_tor>heim_tor AND ergz_status='ended')+(select count(*) from tabelle where gast_user='%u' AND heim_team=gast_team
            AND heim_tor>gast_tor AND ergz_status='ended')+(select count(*) from tabelle where gast_user='%u' AND ergz_gast_t=gast_team
            AND gast_tor>heim_tor AND ergz_status='ended')) as vier from tabelle order by vier",
            mysql_real_escape_string($user),
            mysql_real_escape_string($user),
            mysql_real_escape_string($user),
            mysql_real_escape_string($user));
            $result= mysql_query($sql);
            $datensatz = mysql_fetch_row($result);
            $siege =  $datensatz[0];
            if (!$siege){$siege==0;}
  
              $siegerpunkte = $siege * 3;
  


            $sql= sprintf("SELECT DISTINCT((select count(*) from tabelle where heim_user_id='%u' AND heim_team=heim_user_team
            AND heim_tor=gast_tor AND ergz_status='ended')+(select count(*) from tabelle where heim_user_id='%u' AND ergz_gast_t=heim_user_team
            AND gast_tor=heim_tor AND ergz_status='ended')+(select count(*) from tabelle where gast_user='%u' AND heim_team=gast_team
            AND heim_tor=gast_tor AND ergz_status='ended')+(select count(*) from tabelle where gast_user='%u' AND ergz_gast_t=gast_team
            AND gast_tor=heim_tor AND ergz_status='ended')) as vier from tabelle",
            mysql_real_escape_string($user),
            mysql_real_escape_string($user),
            mysql_real_escape_string($user),
            mysql_real_escape_string($user));
            $result= mysql_query($sql);
            $datensatz = mysql_fetch_row($result);
            $remis = $datensatz[0];
            if (!$remis) {$remis==0;}
            
            $remi = $remis * 1;
            $Punkte =  $siegerpunkte + $remi;
 
Warum nimmst du nicht einfach alles in ein Query?

Naja, ansonsten:
Alles in ein Array schmeissen
Dann noch ein Punktearray dazu und am Schluss mit einem array_multisort sortieren
...
 
Mit Variablen und Subquerys:

Hier meine abfrage für eine Liga-Tabelle:
SQL:
SELECT
			t.ID,
			t.teamname,
			@heimpunkte := (SELECT sum(s.heimpunkte) FROM spielplan s WHERE s.heim = t.ID AND t.liga_id=s.liga_id AND t.aktiv=1 AND (SELECT aktiv FROM teams WHERE ID=s.gast) = 1 GROUP BY t.ID ) AS heimpunkte,
			@gastpunkte := (SELECT sum(s.gastpunkte) FROM spielplan s WHERE s.gast = t.ID AND t.liga_id=s.liga_id AND t.aktiv=1 AND (SELECT aktiv FROM teams WHERE ID=s.heim) = 1 GROUP BY t.ID ) AS gastpunkte,
			@heimspiele := (SELECT sum(s.heimspiele) FROM spielplan s WHERE s.heim = t.ID AND t.liga_id=s.liga_id AND t.aktiv=1 AND (SELECT aktiv FROM teams WHERE ID=s.gast) = 1 GROUP BY t.ID ) AS heimspiele,
			@gastspiele := (SELECT sum(s.gastspiele) FROM spielplan s WHERE s.gast = t.ID AND t.liga_id=s.liga_id AND t.aktiv=1 AND (SELECT aktiv FROM teams WHERE ID=s.heim) = 1 GROUP BY t.ID ) AS gastspiele,
			@heimgegenspiele := (SELECT sum(s.heimspiele) FROM spielplan s WHERE s.gast = t.ID AND t.liga_id=s.liga_id AND t.aktiv=1 AND (SELECT aktiv FROM teams WHERE ID=s.heim) = 1 GROUP BY t.ID ) AS heimgegenspiele,
			@gastgegenspiele := (SELECT sum(s.gastspiele) FROM spielplan s WHERE heim = t.ID AND t.liga_id=s.liga_id AND t.aktiv=1 AND (SELECT aktiv FROM teams WHERE ID=s.gast) = 1 GROUP BY t.ID ) AS gastgegenspiele,
			@tuniere := (SELECT count(s.entry) FROM spielplan s WHERE s.gast=t.ID AND s.entry=1 AND (SELECT aktiv FROM teams WHERE ID=s.heim) = 1 OR s.heim=t.ID AND s.entry=1 AND (SELECT aktiv FROM teams WHERE ID=s.gast) = 1 AND t.aktiv=1 AND t.liga_id=s.liga_id GROUP BY t.ID ) AS tuniere,
			@spiele_all := (@heimspiele + @gastspiele) AS spiele_all,
			@gegen_all := (@heimgegenspiele + @gastgegenspiele) AS gegen_all,
			@spiele_diff := (@spiele_all - @gegen_all) AS spiele_diff,
			@heim_all := (@heimpunkte + @gastpunkte) AS heim_all
		FROM
			teams t 
		WHERE
			t.liga_id=".$id." AND t.aktiv=1";
 
Danke @Maniac_81 aber ich will es mal mit dem Array versuchen, aber auch da sortiert er nicht.

Bin ich den auf dem richtigen Wege ?

PHP:
$siege = array( "viersiege" => $siegrow["viersiege"]);

foreach($siege as $sieg){

}


array_multisort($siege, SORT_DESC);
echo $sieg,"<br>";
 
Oder etwas einfacher mit SUM(IF(...))
SQL:
SELECT 
	((siege*3)+remis) AS punkte,
	myData.*
FROM
	(
		SELECT
			user_name,
			user_id,
		        -- Dein erstes Query aus der Schleife zusammengefasst
			(
				SUM(IF(heim_team=heim_user_team AND heim_tor>gast_tor , 1, 0)) +
				SUM(IF(ergz_gast_t=heim_user_team AND gast_tor>heim_tor , 1, 0)) +
				SUM(IF(heim_team=gast_team AND heim_tor>gast_tor , 1, 0)) +
				SUM(IF(ergz_gast_t=gast_team AND gast_tor>heim_tor, 1, 0))
			) AS siege,
		        -- Dein zweites Query aus der Schleife zusammengefasst
			(
				SUM(IF(heim_team=heim_user_team AND heim_tor=gast_tor , 1, 0)) +
				SUM(IF(ergz_gast_t=heim_user_team AND gast_tor=heim_tor , 1, 0)) +
				SUM(IF(heim_team=gast_team AND heim_tor=gast_tor , 1, 0)) +
				SUM(IF(ergz_gast_t=gast_team AND gast_tor=heim_tor, 1, 0))
			) AS remis
		FROM 
			tabelle,
			user 
		WHERE 
			user_id=ergebnis_heim_id 
			OR user_id=gast_user_id 
			AND ergz_status='ended' 
		GROUP BY user_id 
	) AS myData
ORDER BY 
	((siege*3)+remis)

SUM(IF([Bedingung], 1, 0)) ist sozusagen ein COUNT() mit Bedingung
 
Zuletzt bearbeitet von einem Moderator:
Dankeschön für die Tollen Antworten.

Habe mal versucht die Punkte mit einem Array auszurechnen,klappt auch wunderbar nur sortiert er es nicht.

Wieso nicht ?

PHP:
$Punkte_siege = array( "viersiege" => $siegrow["viersiege"] * 3 + $remirow["vierremi"]);


foreach ( $Punkte_siege as $Punkte ) {

}


array_multisort($Punkte_siege, SORT_DESC);
 
$Punkte_siege ist so auch nur ein Array mit meit einem Eintrag. Wenn man den sortiert, ist immer noch der eine Eintrag an erster und einziger Position.
Du willst aber ein Arrayx, der pro User (oder team) ein Eintrag hat.
Code:
$punkteArray:
array( 
    [id von Team 1] => [punkte von Team 1], 
    [id von Team 2] => [punkte von Team 2],
    ... 
    [id von Team X] => [punkte von Team X])

Dann kannst du entweder mit asort oder arsort() sortieren und die id aus dem key auslesen oder du kannst die id zuerst extrahieren und dann ein Multisort durchführen
PHP:
$ids = array_keys($punkteArray);
array_multisort($punkteArray, SORT_DESC, SORT_NUMERIC, $ids);
 
Zurück