Announcement

Collapse
No announcement yet.

Abfrage erweitern um einen Wert einer anderen Tabelle

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Abfrage erweitern um einen Wert einer anderen Tabelle

    Hallo,

    ich habe ein Problem bei einer SQL-Abfragen und komme nicht weiter.

    In einer Tabelle stehen mehrere Speiler mit Team-Zugehörigkeit.

    1 Name 1 A
    2 Name 2 B
    ... uws.
    Nun mach ich eine Abfrage in dem alle Spieler eines Teams gegen alle Spieler jeden anderen Teams antreten.
    Die Abfrage sieht so aus:
    [highlight=sql]
    SELECT
    CONCAT(spielerA.team, spielerA.id, '-', spielerB.category, spielerB.id) AS begegnung_id,
    *
    FROM
    spieler spielerA,
    spieler spielerB
    WHERE
    spielerA.team< spielerB.team
    ORDER BY begegnung_id
    ;
    [/highlight]

    Bei 3 Team a 5 Spieler erhalte ich 75 Begegnungen. Mittels CONCAT baue ich mir eine ID für die Begegnung.

    Nun zu meinem Problem:
    Ich speichere in einer andere Tabelle die Statistiken der Begegnungen. Also zum Beispiel wie oft eine Begegnung gespielt worden ist. Diese Statistiken würde ich gerne mittels "begegnung_id" abfragen und an die obere Abfrage dran hängen. Lieder bekomme ich das nicht hin. Hier mal ein Ansatz den ich hatte:
    [highlight=sql]
    SELECT
    CONCAT(spielerA.team, spielerA.id, '-', spielerB.category, spielerB.id) AS begegnung_id,
    *,
    begegnung.gespielt
    FROM
    spieler spielerA,
    spieler spielerB,
    begegnung
    WHERE
    spielerA.team< spielerB.team
    AND
    begegnung.id = begegnung_id
    ORDER BY begegnung_id
    ;
    [/highlight]

    Dies funktioniert leider nicht.

    Würde mich über jeden Hinweis freuen!

    Danke und Gruß
    Kinger
    Zuletzt editiert von Kinger; 25.04.2013, 00:17.

  • #2
    Ich denke du musst es so machen:

    [highlight=sql]
    SELECT
    CONCAT(spielerA.team, spielerA.id, '-', spielerB.category, spielerB.id) AS begegnung_id,
    *,
    begegnung.gespielt
    FROM
    spieler spielerA,
    spieler spielerB,
    begegnung
    WHERE
    spielerA.team< spielerB.team
    AND
    begegnung.id = CONCAT(spielerA.team, spielerA.id, '-', spielerB.category, spielerB.id)
    ORDER BY begegnung_id
    ;
    [/highlight]

    Gruss

    Comment


    • #3
      Hallo Wernfried,

      danke für deine Antwort. So hatte ich es auch schon ausprobiert. Die SQL-Abfrage ist auch gültig. Aber leider bekomme ich ein leeres Resultat zurück. Eingangs hatte ich vergessen zu erwähnen, dass in der Tabelle am Anfrang noch keine Begegnungen gespeichert sind. Sprich, die Tabelle ist noch leer. Statistiken der Begegnungen sollen erst gespeichert werden wenn sie auch stattgefunden hat.

      Ist es möglich der SQL-Abfrage zu sagen, wenn unter Begegnungen noch nichts eingetragen ist gehe davon aus, dass die Werte 0 sind?

      Gruß Kinger

      Comment


      • #4
        Hallo,

        formuliere deine Joins EXPLIZIT. Mit einem OUTER JOIN kannst du dann erreichen, dass alle Begegnungen angezeigt werden und die Ergebnisse nur dann, wenn sie auch da sind.

        Gruß Falk

        Anmerkung: Das GROUP BY in der Abfrage ist Unsinn! Erstens wird keinerlei Aggregatfunktion verwendet - also wozu gruppieren und Zweitens ist diese Gruppierung nicht regelkonform und führt sehr wahrscheinlich zu undefinierten Ergebnissen, bzw. ist sie nur unter MySQL und auf keinem anderen DBMS lauffähig.
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Danke! Das war der richtige Anstoß!

          Meine funktionierende Abfrage sieht nun wie folgt aus:
          [HIGHLIGHT=sql]
          SELECT
          *,
          CONCAT(spielerA.team, spielerA.id, '-', spielerB.team, spielerB.id) AS begegnung_id,
          COALESCE(begegnungen.gespielt, 0) AS begegnungen_gespielt
          FROM
          (
          spieler AS spielerA
          INNER JOIN
          spieler AS spielerB
          ON
          spielerA.team < spielerB.team
          )
          LEFT JOIN
          begegnungen as begegnungen
          ON
          begegnungen.id = CONCAT(spielerA.team, spielerA.id, '-', spielerB.team, spielerB.id)
          ORDER BY
          begegnung_id
          ;
          [/HIGHLIGHT]

          @Falk Prüfer: Was meinst du mit dem GROUP BY? Eigentlich gruppiere ich nicht. Meinst du vielleicht das ORDER BY?

          Comment


          • #6
            Originally posted by Kinger View Post
            @Falk Prüfer: Was meinst du mit dem GROUP BY? Eigentlich gruppiere ich nicht. Meinst du vielleicht das ORDER BY?
            ... dadurch das es noch zur Hälfte nach unten gescrollt war (schlechte Ausrede...), hab ich das ORDER BY als GROUP BY gelesen ... Also vergiss die Anmerkung

            Gruß Falk
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              ^^ ... Sowas kommt vor. Hauptsache das Problem ist gelöst!

              Gruß Kinger

              Comment

              Working...
              X