[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:Das Ergebnis dieses Scripts wäre:12345678910111213141516171819202122232425262728293031323334
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
;
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 Abfragefolgende Daten:12SELECT
1
AS
id,
'Survey 1'
AS
name
UNION
ALL
SELECT
2
AS
id,
'Survey 2'
AS
name
+----+----------+ | id | name | +----+----------+ | 1 | Survey 1 | | 2 | Survey 2 | +----+----------+
Was hat meine Abfrage also bewirkt:mit den Tabellen:123456SELECT
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
;
… 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:Wenn ich mich nicht vertan habe, sollte das genau das erzielen, was du dir wünscht.123456SELECT
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
;
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