Prozentualer Anteil an allen Eintragungen

ArFiBa

Erfahrenes Mitglied
Hallo,

ich bin grade dabei eigene Charts zu entwickeln (siehe hier ) dazu gibt es eine mysql Datenbank mit den beiden Tabellen chart_titel und chart_wertung mit den folgenden Feldern:

Chart_titel:
Titel_id (autointeger)
Artist
Titel (varchar)
Andrucken (varchar)

Chart_wertung:
Wertung_id (autointeger)
Titel_id (int durch Umsetzung mit Tabelle titel verbunden)
Wertung (int)

Worum es mir nun geht ist das PHP-Script um folgende Ausgabe zu erhalten:
Titel, Artist, Prozentualer Anteil an allen Wertungen

Ein kleines Beispiel:
Für Titel 1 wurde insgesamt mit 30 Punkten abgestimmt.
Für Titel 2 mit 70

Nun hätte ich gerne die Ausgabe Titel 1 30% und Titel 2 70%.
Dabei sollen alle Eintragungen unterdrückt werden bei denen im Feld Andrucken „no“ steht.

Theoretisch ne Sache mit PercentOfSum . Das klappt aber irgendwie nicht.

Ach ja eins noch: Bisher ist alles in ASP. Das bin ich aber grade am ändern, da PHP einfach mehr Möglichkeiten bietet.
 
da PHP einfach mehr Möglichkeiten bietet.
diese Möglichkeiten musst du aber auch kennen....In PHP gibts kein PercentOfSum:-)

Code:
$prozent=($einzelPunkte*100)/$gesamtpunkte;
 
Ab MySQL 4.1 kennt MySQL Subquerys. Vielleicht funktioniert ja folgendes:
Code:
SELECT 
  Chart_titel.Titel_id,
  Chart_titel.Artist,
  Chart_titel.Titel,
  (SUM(Chart_wertung.Wertung)
    * 100
    / (SELECT SUM(Chart_wertung.Wertung) 
      FROM Chart_titel
      JOIN
      Chart_wertung
      ON
      (Chart_titel.Titel_id=Chart_wertung.Titel_id
        AND
        Chart_titel.Andrucken!='no'
      )
    ) 
  AS prozent
  FROM Chart_titel
  JOIN Chart_wertung ON (
    Chart_titel.Titel_id=Chart_wertung.Titel_id
    AND
    Chart_titel.Andrucken!='no'
  )
  GROUP_BY Chart_titel.Titel_id
  ORDER BY prozent

Würd mich mal interessieren, ob das klappt.

Einfach mal bei PHPMyAdmin eingeben und schauen, was rauskommt.

Gruß hpvw
 
Hallo Habs mal Probiert. PHP-Admin gibt den folgenden Fehler zurück:

#1064 - Fehler in der Syntax bei 'SELECT SUM(Chart_wertung.Wertung)
FROM Chart_titel
' in Zeile 7.
 
Es waren tatsächlich drei Fehler drin.
Der den Du beschreibst könnte allerdings daher kommen, dass Du eine MySQL Version hast, die noch keine Subselects kennt.
Die Version zeigt PHPMyAdmin Dir auf der Startseite oben.

1. Fehler: GROUP BY hat keinen Unterstrich zur Verknüpfung, ein Tippfehler
2. Fehler: Vor AS fehlte eine schließende Klammer, nicht ordentlich nachgezählt.
3. Fehler: Der Sortierung musste noch ein DESC nachgestellt werden, da er sonst den schlechtesten zu erst nimmt.

Hier das korrigierte Query:
Code:
SELECT 
  Chart_titel.Titel_id,
  Chart_titel.Artist,
  Chart_titel.Titel,
  (SUM(Chart_wertung.Wertung)
    * 100
    / (SELECT SUM(Chart_wertung.Wertung) 
      FROM Chart_titel
      JOIN
      Chart_wertung
      ON
      (Chart_titel.Titel_id=Chart_wertung.Titel_id
        AND
        Chart_titel.Andrucken!='no'
      )
    ) 
  ) AS prozent
  FROM Chart_titel
  JOIN Chart_wertung ON (
    Chart_titel.Titel_id=Chart_wertung.Titel_id
    AND
    Chart_titel.Andrucken!='no'
  )
  GROUP BY Chart_titel.Titel_id
  ORDER BY prozent DESC

Allerdings ist mir bei näherem Nachdenken auch aufgefallen, dass eine Bewertung auf Basis der Gesamtsumme der Wertungen eines Titels ganz schön ungerecht werden kann, wenn zum Beipiel für einen Titel deutlich öfter abgestimmt wird.

Gerechter, auch wenn gerecht subjektiv ist, wäre eine Bewertung auf Basis des Durchschnitts. Das mit Prozenten benötigt aber auch wieder Subqueries.
Du könntest bei Gleichstand die Anzahl der Wertungen als weiteres Entscheidungskriterium nehmen.
Ohne direkte Prozentberechnung sieht das dann so aus:
Code:
SELECT 
  Chart_titel.Titel_id,
  Chart_titel.Artist,
  Chart_titel.Titel,
  (AVG(Chart_wertung.Wertung)) 
  AS durchschnitt,
  COUNT(*) AS anzahl
  FROM Chart_titel
  JOIN Chart_wertung ON (
    Chart_titel.Titel_id=Chart_wertung.Titel_id
    AND
    Chart_titel.Andrucken!='no'
  )
  GROUP BY Chart_titel.Titel_id
  ORDER BY durchschnitt DESC, anzahl DESC
Ich habe übrigends aus Bequemlichkeit auf einer reduzierten Tabellenstruktur gestestet. Es kann also sein, das es ein paar Tippfehler beim Anpassen der Tabellen- und Feldnamen gegeben hat.

In PHP kannst Du nachträglich ja noch die Prozente berechnen, wenn Dein MySQL keine Subselects mitmacht.
Dazu musst Du vor dem Auslesen der Zeilen eine Variable $gesamtMittel mit 0 setzen und dann in der Schleife, die die Zeilen aus der Datenbank fischt, jedesmal den Mittelwert der Zeile hinzuzählen. In der Schleife gibst Du nichts aus, sondern schreibst die Datensätze nur in ein Array! Mit z.B. [phpf]foreach[/phpf] durchläufst Du dann dieses Array nochmal und berechnest mit Sven's Formel den Prozentwert. In dieser Schleife kannst Du nach dem berechnen dann auch gleich die Ausgabe machen.
Wegen solcher doppelten Schleife versuche ich immer alles im Query zu erledigen, ;)

Gruß hpvw
 
Erst mal tausend Dank es geht, fast!

In MyAdmin läufts einwandfrei durch nur in PHP nicht so ganz. Da komt nur der erste Datensatz (der mit der höchsten %-Zahl) und dann der Fehler:
Warning: mysql_fetch_assoc(): 3 is not a valid MySQL result resource in test.php on line 24

Hier der Dazugehörige PHP Code:
PHP:
<?php require_once('../../Connections/db.php'); ?>
<?php
mysql_select_db($database_db, $db);
$query_Chartabfrage = "SELECT    Charts_titel.Titel_id,   Charts_titel.titel_Artist,   Charts_titel.titel_Titel,   (SUM(Charts_wertung.Wertung)     * 100     / (SELECT SUM(Charts_wertung.Wertung)        FROM Charts_titel       JOIN       Charts_wertung       ON       (Charts_titel.Titel_id=Charts_wertung.Titel_id         AND         Charts_titel.titel_Andrucken!='0'       )     )    ) AS prozent_von_wertung   FROM Charts_titel   JOIN Charts_wertung ON (     Charts_titel.Titel_id=Charts_wertung.Titel_id     AND     Charts_titel.titel_Andrucken!='0'   )   GROUP BY Charts_titel.Titel_id   ORDER BY prozent_von_wertung DESC";
$Chartabfrage = mysql_query($query_Chartabfrage, $db) or die(mysql_error());
$row_Chartabfrage = mysql_fetch_assoc($Chartabfrage);
$totalRows_Chartabfrage = mysql_num_rows($Chartabfrage);

mysql_free_result($Chartabfrage);
?>

<table border="1">
  <tr>
    <td>Artist</td>
    <td>Titel</td>
    <td>Wertung</td>
  </tr>
  <?php do { ?>
  <tr>
    <td><?php echo $row_Chartabfrage['titel_Artist']; ?></td>
    <td><?php echo $row_Chartabfrage['titel_Titel']; ?></td>
    <td><?php echo $row_Chartabfrage['prozent_von_wertung']; ?>%</td>
  </tr>
  <?php } while ($row_Chartabfrage = mysql_fetch_assoc($Chartabfrage)); ?>
</table>

Line 24 ist hier die vorletzte.
 
Vielleicht solltest Du das mysql_free_result weglassen, wenn Du noch mal auf das Result zugreifen willst?
Normalerweise kenne ich das in der Art:

PseudoCode:
Code:
query starten
numrows, falls benötigt merken

tabellenkopf mit Überschriften ausgeben (table tr th /th th /th ... /tr)
while fetch row/array/assoc {
  ausgabe zeilenbeginn (tr)
  ausgabe zellenbeginn (td)
  ausgabe zelle1 der Zeile
  ausgabe zellenende (/td)
  ausgabe zellenbeginn (td)
  ausgabe zelle2 der Zeile
  ausgabe zellenende (/td)
  ...
  ausgabe zeilenende (/tr)
}
Ausgabe Tabellenende (/table)
 
Zurück