kostenloser Webspace werbefrei: lima-city


[MySQL] Zusammengehörige Tabellen geordnet ausgeben

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    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:
    +-------+-----------+-----+----------+-----+
    | 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 |
    +-------+-----------+-----+----------+-----+
    Die Optionen werden also nach Umfrage und absteigend sortiert ausgegeben.

    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
  4. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    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
  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    c143 schrieb:
    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.
    Das, und ein bisschen mehr, hat mein Query gemacht :-D

    Unverständlich sind vermutlich die nicht existierenden Tabellen gewesen. So ergibt die Abfrage
    SELECT 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:
    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
    … und den Daten:
    surveys:
    +----+----------+
    | id | name     |
    +----+----------+
    |  1 | Survey 1 |
    |  2 | Survey 2 |
    +----+----------+
    options:
    +----+-----------+-----+
    | id | name      | sid |
    +----+-----------+-----+
    |  7 | Option 1  |   1 |
    | 13 | Option 13 |   1 |
    | 42 | Option 42 |   2 |
    | 73 | Option 73 |   1 |
    | 74 | Option 74 |   2 |
    +----+-----------+-----+
    votes:
    +----+-----+
    | 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:
    +-------+-----------+-----+----------+-----+
    | 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 |
    +-------+-----------+-----+----------+-----+
    Das sieht also genau danach aus, was du haben wolltest … vllt noch mit WHERE nur die eine Umfrage, die dich interessiert, herausfiltern.

    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
  6. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    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
  7. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Hast du schon mal geschaut, was
    print_r($row);
    ausgibt?

    Den Fehler mit der
    WHERE
    -Klausel kann ich leider nicht nachvollziehen, denn bei mir wird der entsprechende Teil richtig zurückgegeben.

    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
  8. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    hackyourlife schrieb:
    Hast du schon mal geschaut, was
    print_r($row);
    ausgibt?


    Beide Ergebnisse, option und count.

    hackyourlife schrieb:
    Den Fehler mit der
    WHERE
    -Klausel kann ich leider nicht nachvollziehen, denn bei mir wird der entsprechende Teil richtig zurückgegeben.

    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
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!