[MySQL] Zusammengehörige Tabellen geordnet ausgeben
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
ahnung
all
art
ausgabe
code
eins
entsprechende teil
ergebnis
falschen ergebnis
fehler
klausel
option
ordern
richtige ergebnis
tabelle
teil
umfrage
union
url
-
Hallo
Ich habe in meiner Datenbank 3 Tabellen.
Die erste beinhaltet den Titel mit ID.
Die zweite beinhaltet verschiedene Optionen und ist mit der ID des Titels verlinkt und haben eine Vote ID beginnend von 0.
Die dritte beinhaltet Votes für die Optionen, jeder Vote ist ein eigener Eintrag und Verlinkt zur VoteID startend bei 1 und zur TitelID.
Diese werden dann gezählt und die meisten stehen ganz oben.
Optionstabelle
Das ordnen funktioniert, nur werden wirklich nur die Zahlen geordnet, die Optionen bleiben an der gleichen Stelle.
Ich habe es zuerst mit zwei verschiedenen Querys versucht, dann waren die Optionen normal geordnet, von 1 nach oben und die Ergebnise mit der Höchsten Zahl, aber standen somit neben der Falschen option.
Dann hab ich es im gleichen Query versucht:
SELECT COUNT(`voteID`) as count FROM `votes` WHERE `poll_ID` = 385 AND `voteID` = 1 union all SELECT COUNT(`voteID`) as count FROM `votes` WHERE `poll_ID` = 385 AND `voteID` = 2 union all SELECT COUNT(`voteID`) as count FROM `votes` WHERE `poll_ID` = 385 AND `voteID` = 3 union all SELECT `option` FROM options WHERE poll_ID= 385 ORDER BY count DESC
Ergebnis
Die Votes werden richtig geordnet, die Optionen falsch und einfach alles in einer Spalte.
Ich wüsste jetzt echt nicht, wie ich die Option zum richtigen Vote verknüpfen soll, da ich ja jeden einzelnen Vote zähle. Habt ihr da Ideen? Wenns Vorschläge für eine andere Datenbankstruktur gibt auch willkommen.
Danke für die Hilfe
Gruss c143 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ich habe zwar noch nicht ganz durchschaut, was du erreichen magst, nehme aber an, dass du eine Art Auswertung erstellen magst, wo das Ergebnis sortiert ausgegeben wird. Dies würdest du so erreichen können:
SELECT COUNT(V.id) AS count, O.name AS oname, O.id AS oid, S.name AS sname, S.id AS sid FROM ( SELECT 1 AS id, 'Survey 1' AS name UNION ALL SELECT 2 AS id, 'Survey 2' AS name ) S JOIN ( SELECT 7 AS id, 'Option 1' AS name, 1 AS sid UNION ALL SELECT 13 AS id, 'Option 13' AS name, 1 AS sid UNION ALL SELECT 42 AS id, 'Option 42' AS name, 2 AS sid UNION ALL SELECT 73 AS id, 'Option 73' AS name, 1 AS sid UNION ALL SELECT 74 AS id, 'Option 74' AS name, 2 AS sid ) O ON O.sid = S.id LEFT JOIN ( SELECT 1 AS id, 13 AS oid UNION ALL SELECT 2 AS id, 7 AS oid UNION ALL SELECT 3 AS id, 13 AS oid UNION ALL SELECT 4 AS id, 7 AS oid UNION ALL SELECT 5 AS id, 13 AS oid UNION ALL SELECT 6 AS id, 13 AS oid UNION ALL SELECT 7 AS id, 42 AS oid UNION ALL SELECT 8 AS id, 7 AS oid UNION ALL SELECT 9 AS id, 13 AS oid UNION ALL SELECT 10 AS id, 42 AS oid UNION ALL SELECT 11 AS id, 13 AS oid UNION ALL SELECT 12 AS id, 13 AS oid UNION ALL SELECT 13 AS id, 42 AS oid UNION ALL SELECT 14 AS id, 42 AS oid UNION ALL SELECT 15 AS id, 42 AS oid UNION ALL SELECT 16 AS id, 73 AS oid ) V ON V.oid = O.id GROUP BY S.id, O.id ORDER BY S.id, count DESC;
Das Ergebnis dieses Scripts wäre:
Die Optionen werden also nach Umfrage und absteigend sortiert ausgegeben.+-------+-----------+-----+----------+-----+ | count | oname | oid | sname | sid | +-------+-----------+-----+----------+-----+ | 7 | Option 13 | 13 | Survey 1 | 1 | | 3 | Option 1 | 7 | Survey 1 | 1 | | 1 | Option 73 | 73 | Survey 1 | 1 | | 5 | Option 42 | 42 | Survey 2 | 2 | | 0 | Option 74 | 74 | Survey 2 | 2 | +-------+-----------+-----+----------+-----+
Du müsstest das Statement natürlich deinen Bedürfnissen anpassen …
Fals das nicht das ist, was du suchst, solltest du dich etwas verständlicher ausdrücken.
Beitrag zuletzt geändert: 13.2.2014 18:28:00 von hackyourlife -
hackyourlife schrieb:
Fals das nicht das ist, was du suchst, solltest du dich etwas verständlicher ausdrücken.
Ehrlich gesagt hatte ich keine Ahnung, was dein Script für einen Nutzen hat, genau so wenig, wie du eine Ahnung hattest, was ich wollte. :D Aber als ich mir deinen Code angesehen habe, bin ich auf eine Idee gekommen. Hatte wenig Ahnung von joins, hab mich jetzt bisschen informiert, meine Datenbankstruktur angepasst und mit einem simplen INNER JOIN mit COUNT und WHERE komme ich auf mein gewolltes Ergebnis.
Also danke für deine Antwort! :)
Gruss c143
EDIT: Doch noch ein Problem. Query:
SELECT `option` , COUNT( vote ) AS count FROM poll_options INNER JOIN poll_answer ON poll_options.option_ID = poll_answer.vote WHERE poll_options.poll_ID =396 ORDER BY count DESC
Tabelle mit Votes:
ID | poll_ID | vote ---------------------------------- 1 | 396 | 3 2 | 396 | 3 3 | 396 | 3 4 | 396 | 3 5 | 396 | 1
Ausgabe mit Query:
option | count --------------- eins | 5 <- Mein Text
Gewünschte ausgabe:
option | count --------------- drei | 4 eins | 1
Also dass nicht alle zusammen gezählt werden, sondern alles getrennt.
Beitrag zuletzt geändert: 13.2.2014 19:56:26 von c143 -
c143 schrieb:
Das, und ein bisschen mehr, hat mein Query gemacht
Ausgabe mit Query:
Gewünschte ausgabe:option | count --------------- eins | 5 <- Mein Text
Also dass nicht alle zusammen gezählt werden, sondern alles getrennt.option | count --------------- drei | 4 eins | 1
Unverständlich sind vermutlich die nicht existierenden Tabellen gewesen. So ergibt die AbfrageSELECT 1 AS id, 'Survey 1' AS name UNION ALL SELECT 2 AS id, 'Survey 2' AS name
folgende Daten:+----+----------+ | id | name | +----+----------+ | 1 | Survey 1 | | 2 | Survey 2 | +----+----------+
Was hat meine Abfrage also bewirkt:SELECT COUNT(V.id) AS count, O.name AS oname, O.id AS oid, S.name AS sname, S.id AS sid FROM surveys S JOIN options O ON O.sid = S.id LEFT JOIN votes V ON V.oid = O.id GROUP BY S.id, O.id ORDER BY S.id, count DESC;
mit den Tabellen:
… und den Daten:surveys: id int, -- survey id, unique name varchar -- survey title options: id int, -- option id, unique sid int, -- survey → surveys.id name varchar -- option name votes: id int, -- vote id, unique oid int -- option id → options.id
surveys:
options:+----+----------+ | id | name | +----+----------+ | 1 | Survey 1 | | 2 | Survey 2 | +----+----------+
votes:+----+-----------+-----+ | id | name | sid | +----+-----------+-----+ | 7 | Option 1 | 1 | | 13 | Option 13 | 1 | | 42 | Option 42 | 2 | | 73 | Option 73 | 1 | | 74 | Option 74 | 2 | +----+-----------+-----+
+----+-----+ | id | oid | +----+-----+ | 1 | 13 | | 2 | 7 | | 3 | 13 | | 4 | 7 | | 5 | 13 | | 6 | 13 | | 7 | 42 | | 8 | 7 | | 9 | 13 | | 10 | 42 | | 11 | 13 | | 12 | 13 | | 13 | 42 | | 14 | 42 | | 15 | 42 | | 16 | 73 | +----+-----+
Um das Ergebnis erneut zu posten:
Das sieht also genau danach aus, was du haben wolltest … vllt noch mit WHERE nur die eine Umfrage, die dich interessiert, herausfiltern.+-------+-----------+-----+----------+-----+ | count | oname | oid | sname | sid | +-------+-----------+-----+----------+-----+ | 7 | Option 13 | 13 | Survey 1 | 1 | | 3 | Option 1 | 7 | Survey 1 | 1 | | 1 | Option 73 | 73 | Survey 1 | 1 | | 5 | Option 42 | 42 | Survey 2 | 2 | | 0 | Option 74 | 74 | Survey 2 | 2 | +-------+-----------+-----+----------+-----+
In deinem Schema sieht es nach Redundanzen aus (poll_answer.poll_ID, poll_options.poll_ID), aber egal …
Deine Abfrage etwas angepasst:SELECT O.`option`, COUNT(V.vote) AS count FROM poll_options O LEFT JOIN poll_answer V ON V.vote = O.option_ID WHERE O.poll_ID = 396 GROUP BY O.option_id ORDER BY count DESC;
Wenn ich mich nicht vertan habe, sollte das genau das erzielen, was du dir wünscht.
Beitrag zuletzt geändert: 13.2.2014 20:45:46 von hackyourlife -
Schomal vielen dank! Ist genau das was ich will, ja :) Nur funktioniert das mit WHERE noch nicht ganz. Es zählt einfach alle Einträge, ich hätte gerne nur die mit der poll_ID, die ich angebe.
Gruss c143
Edit:
Ausserdem scheint es mir nicht möglich, count per PHP auszulesen:
while($row = mysqli_fetch_array($votes)){ echo $row['count']; }
'option' kann ich ohne Probleme auslesen.
Beitrag zuletzt geändert: 13.2.2014 21:36:13 von c143 -
Hast du schon mal geschaut, was
ausgibt?print_r($row);
Den Fehler mit der
-Klausel kann ich leider nicht nachvollziehen, denn bei mir wird der entsprechende Teil richtig zurückgegeben.WHERE
Ergibt die Abfrage, wenn du sie mit phpMyAdmin o.ä. ausführst das richtige Ergebnis, also gibt es sicher keinen Fehler im PHP-Script, der zu dem falschen Ergebnis führt? Eventuell wäre es ganz hilfreich, wenn du den PHP-Code zeigst …
Beitrag zuletzt geändert: 13.2.2014 22:47:32 von hackyourlife -
hackyourlife schrieb:
Hast du schon mal geschaut, was
ausgibt?print_r($row);
Beide Ergebnisse, option und count.
hackyourlife schrieb:
Den Fehler mit der
-Klausel kann ich leider nicht nachvollziehen, denn bei mir wird der entsprechende Teil richtig zurückgegeben.WHERE
Ergibt die Abfrage, wenn du sie mit phpMyAdmin o.ä. ausführst das richtige Ergebnis, also gibt es sicher keinen Fehler im PHP-Script, der zu dem falschen Ergebnis führt? Eventuell wäre es ganz hilfreich, wenn du den PHP-Code zeigst …
Auch in phpMyAdmin wird alles gezählt, nicht nur der Teil, den ich angegeben habe. Ich habe eine neue Umfrage erstellt und kann dann pro IP nur ein mal Voten. Also gibt es momentan pro Umfrage auch nur einen Vote. Deshalb sollte es bei allen 0 ausgeben ausser bei dem einen, den ich ausgewählt habe. Aber es zählt einfach alle Votes, die ich bei allen Umfragen gevoted habe. Momentan hab ich insgesammt 5 Einträge, und es zählt mir auch 3, 1, 1, 0 aus = 5.
Also der WHERE Teil liegt anscheinend am Query, aber am PHP Teil stimmt trotzdem etwas nicht. Ich habs auf drei Arten versucht:
1
while($row = mysqli_fetch_array($votes)){ echo '-'.$row[0]; } while($row = mysqli_fetch_array($votes)){ echo '-'.$row[1]; }
2 (Bevorzugt)
while($row = mysqli_fetch_array($votes)){ echo '-'.$row['option']; } while($row = mysqli_fetch_array($votes)){ echo '-'.$row['count']; }
3
while($row = mysqli_fetch_array($votes)){ echo '-'.$row['option'].'-'.$row['count']; }
Alle geben nur option aus, aber bei einem print_r wird auch count im Array angezeigt.
Beitrag zuletzt geändert: 13.2.2014 23:01:42 von c143 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage