Ankündigung

Einklappen
Keine Ankündigung bisher.

Zwei SELECT nebeneinander sortiert nach ID

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Zwei SELECT nebeneinander sortiert nach ID

    Guten Abend, ich verzweifel nun wieder einmal zu später Stund.

    Ich habe denke für euch was einfaches, für mich aber gerade irgendwie ???

    Folgendes...
    Ich möchte mir zwei verschiedene SELECT's ausgeben und diese am Ende neben einander zustehen haben, unterschied ist das FROM. Jedoch habe ich mehrere Datensätze (9 Stück) und dort meckert SQL.
    Einzeln bekomme ich die Werte angezeigt, zusammen bekomme ich einfach nicht gebacken.

    So sollte es aussehen
    paarungID heimteam gastteam
    10 Team A Team B
    11 Team F Team C
    12 Team I Team O
    13 Team D Team M
    14 Team P Team G
    15 Team H Team J
    16 Team N Team R
    17 Team L Team K
    18 Team Q Team E

    PHP-Code:
    SELECT  heim.ID,
            
    verein.name AS heimteam,
            (
    SELECT verein.name
            FROM    verein     RIGHT JOIN teilnehmer USING 
    (vereinID)
                               
    RIGHT JOIN paarung AS gast ON teilnehmer.ID gast.teilnehmer_gastID
            WHERE    teilnehmer
    .wettbewerbID 21
                     
    AND gast.spieltagID 3) AS gastteam
    FROM    verein     RIGHT JOIN teilnehmer USING 
    (vereinID)
                    
    RIGHT JOIN paarung AS heim ON teilnehmer.ID heim.teilnehmer_heimID
    WHERE    teilnehmer
    .wettbewerbID 21
            
    AND heim.spieltagID 3
    ORDER BY heim
    .ID 
    Das bekomme ich
    PHP-Code:
    SQL-Befehl:
       
    SELECT     heim.ID,     verein.name AS heimteam,     (SELECT    verein.name     FROM       verein RIGHT JOIN teilnehmer USING (vereinID)               RIGHT JOIN paarung AS gast ON teilnehmer.ID gast.teilnehmer_gastID) AS gastteam FROM    verein  RIGHT JOIN teilnehmer USING (vereinID)         RIGHT JOIN paarung AS heim ON teilnehmer.ID heim.teilnehmer_heimID WHERE   teilnehmer.wettbewerbID 21     AND heim.spieltagID 3 GROUP BY heim.ID LIMIT 025 
    MySQL meldet

    #1242 - Unterabfrage lieferte mehr als einen Datensatz zurück 
    Hat jemand ein Vorschlag wie ich zum Erfolg komme?

  • #2
    Sieht für mich nach nem klassischen JOIN aus, k.A. warum da ein subselect nötig sein sollte...

    Kommentar


    • #3
      Deine Abfrage ist recht unübersichtlich gestaltet und macht es so schwierig, den Sachverhalt zu durchblicken. Eigentlich kann man ihn gar nicht durchblicken, sondern nur vermuten.

      Du müsstest das Datenmodell zu Deinen Tabellen liefern, damit ersichtlich ist, was Primär und Fremdschlüssel sind und Du müsstest praktischerweise Daten dazu liefern. Denn erst mit der bei Dir vorliegenden Datenkonstellation kann der genannte Fehler überhaupt entstehen.

      Einschub: Das Datenmodell ist u.a. dafür da, solche Fehler von Grund auf zu vermeiden, in dem sich keine falschen Daten eingeben lassen. Solange es nicht bekannt ist, kann dieser Fehler mehrere Ursachen haben, fehlerhafte Daten oder fehlerhaftes Select Statement.

      Die Fehlermeldung ist eigentlich recht leicht verständlich, es werden mehrere Datensätze geliefert, wo nur einer erwartet wurde. Eine typische Situation, bei einem Subselect, das Daten (1 Datensatz) liefern soll, um ihn jeweils in die Ergebniszeile des „Hauptselects“ zu integrieren. Hier in dem Fall als einzige Möglichkeit das „Gastteam“.

      Also nochmal: Das Select Statement liefert statt einen Datensatz mehrere. Das könnte durch entsprechend passende Dateneinträge bzw. eine Korrektur der Daten vermieden werden. Es kann auch an einer falschen Abfrage liegen. Letzteres ist bei Dir wahrscheinlich der Fall. Das Subselect zu „Gastteam“ hat keinen join zum Hauptselect. Wird dieser ergänzt, könnte es funktionieren. Verwendet man sprechendere Alias- das hast Du nur für Tabelle Paarung als Heim und Gast gemacht, kann man das auch besser erkennen.


      Hier eine geänderte Version Deiner Abfrage
      PHP-Code:
      SELECT heim.ID,
             
      vh.name AS heimteam,
             (
      SELECT vg.name
                FROM verein vg
               RIGHT JOIN teilnehmer tg USING 
      (vereinID)
               
      RIGHT JOIN paarung AS gast
                  ON tg
      .ID gast.teilnehmer_gastID
               WHERE tg
      .wettbewerbID 21
                 
      AND gast.spieltagID 3
                 
      and gast.id heim.id      ## << dieser Join fehlt vermutlich
             
      ) AS gastteam
        FROM verein vh
       RIGHT JOIN teilnehmer th USING 
      (vereinID)
       
      RIGHT JOIN paarung AS heim
          ON th
      .ID heim.teilnehmer_heimID
       WHERE th
      .wettbewerbID 21
         
      AND heim.spieltagID 3
       ORDER BY heim
      .ID 

      Kommentar


      • #4
        Nachtrag:
        Die right joins sind recht ungewöhnlich, idR nimmt man left joins, obwohl das eigentlich Geschmackssache ist.
        Ein Aspekt dabei könnte die sogenannte "Driving Table", also vielleicht auf Deutsch die Kerntabelle sein, um die es geht. Mit ihr beginnt man dem Verständnis nach das Select aufzubauen.

        Müssen andere Tabellen hinzugezogen werden, so ergibt sich bei Outer Joins automatisch der Left Join. Wie gesagt, das ist nicht funktional relevant.

        Aber die Outer Joins an sich wären der nächste Punkt, den man in Deiner Abfrage fachlich hinterfragen müsste.
        Gibt es Spiele, in denen einer oder beide Paarungsteilnehmer nicht teilnehmen?

        Wahrscheinlich nicht, also sind es keine Outer Joins.

        Ich habe das und andere Aspekte mal in eine andere Form der Abfrage gebracht.
        Sie sieht rein optisch etwas mehr danach aus, wie der eigentliche Tabellen aufbau ist und die Outer Joins sind einfach weggelassen.
        (ohne Gewähr auf Richtigkeit)
        PHP-Code:
        select h.pidg.pidh.nameg.name from
              
        (SELECT p.id as pidv.name
                 FROM verein v JOIN teilnehmer t USING 
        (vereinID)
                 
        JOIN paarung  AS p ON t.ID p.teilnehmer_gastID
                WHERE t
        .wettbewerbID 21
                  
        AND p.spieltagID 3gast join
              
        (SELECT p.id as pidv.name
                 FROM verein v JOIN teilnehmer t USING 
        (vereinID)
                 
        JOIN paarung  AS p  ON t.ID p.teilnehmer_heimID
                WHERE t
        .wettbewerbID 21
                  
        AND p.spieltagID 3heim
            on gast
        .pid heim.pid 

        Kommentar


        • #5
          Wow, danke... ich dachte mir heute morgen noch warum ich verein nicht mit AS umbenenne, aber ja das war es + deine Anmerkung mit dem fehlenden Join.
          Ich weiß das manchmal mehr Informationen schön wären, aber ich möchte nicht das jemand meine Arbeit macht, da ich selber lernen möchte aus mein Fehlern, darum bitte ich meist nur um Lösungsvorschläge, da ich dann irgendwas nicht verstanden habe oder ich irgendwas übersehe, mich verzettelt habe.
          Dann gebe ich mein Code der mir Schwierigkeiten macht und ein Bsp. was bei raus kommen soll. Wenn dann Infos benötigt werden, kommen die auch um mein Problem zu lösen, wenn es nicht vorher wie jetzt gelöst wurde.

          Ich danke für deine Zeit und die mühe dich mit den klein Teil an Code dort rein zu versetzen und mir den richtigen Fehler auszeigst.

          Kurz und knapp, es klappt, danke.

          Kommentar


          • #6
            Zu dein Nachtrag der grad parallel zu meiner Antwort kam, er funktioniert genauso gut. Musste lediglich noch die restlichen heim und gast in h und g ändern.

            Kommentar


            • #7
              Zitat von Snickers Beitrag anzeigen
              Wenn dann Infos benötigt werden, kommen die auch um mein Problem zu lösen..
              Es ist klar, dass es immer Ermessenssache ist, was notwendig ist, um eine Frage zu beantworten. Oder auch nicht, glasklar ist:
              -Datenmodell
              -Beispieldaten
              -Select
              -Fehler
              -Wunschergebnis
              -Fehlergebnis
              wären eine Garantie für richtige Antworten.

              Man würde niemals bei der Autowerkstatt anrufen und fragen, was es ist, wenn der Motor das und das Geräusch macht und das Automodell oder Baujahr oder Motorart verschweigen oder es erst "rausgeben", wenn die Werkstatt mit dem bisschen Infos nicht weiterkommt. (kein gutes Beispiel, was nicht ordentlich hinkt, man würde natürlich die komplette Karre dort vorbeibringen und die Werkstatt würde am Telefon gar nicht mal anfangen zu spekulieren)

              Mal andersrum:
              Dir (allen) muss klar sein, dass Du mit diesen zurückgehaltenen Infos den Aufwand beim Helfer erhöhst. Und das kann nicht in Deinem Interesse sein. Denn Du verringerst die Zahl der Hilfsbereiten dadurch und die Treffsicherheit eines Vorschlags.
              Nicht übel nehmen, aber ich würde magere Infos eher als Bequemlichkeit bezeichnen. (Hat ja diesmal auch geklappt, Deine Sparsamkeit hat sich "gelohnt")
              Wie auch immer, es muss auch nicht gleich die ganze Datenbank als Dump geschickt werden, aber man sollte schon verstehen, das man mit minimalistischen Anhaltspunkten die Lösung schwieriger macht, als nötig.

              Kommentar


              • #8
                Ist zur Kenntnis genommen, macht auch alles Sinn was du sagt. ...ich werde mich bessern beim nächsten Problem

                Kommentar

                Lädt...
                X