Announcement

Collapse
No announcement yet.

MySQL Abfrage die als union sich nicht nach einer Left Join Textspalte sortieren läßt

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

  • MySQL Abfrage die als union sich nicht nach einer Left Join Textspalte sortieren läßt

    Hallo ihr lieben Leutz,

    ich habe eine SQL Abfrage die, wenn man den union-Teil wegläßt einwandfrei funktioniert,
    mit union beschwert er sich beim ORDER BY, daß ihm die Spalte 'komponente.Text' unbekannt sei,
    Zitat: Unknown column 'komponente.Text' in 'order clause'

    und so sieht meine Abfrage aus

    SELECT PC_SOUND.id, PC_SOUND.bild, PC_SOUND.modell_name, PC_SOUND.modell_nummer, komponente.Text, hersteller.Text
    FROM ( PC_SOUND_DB AS PC_SOUND )
    LEFT JOIN PC_KOMPONENTE AS komponente ON PC_SOUND.komponente = komponente.id
    LEFT JOIN PC_HERSTELLER AS hersteller ON PC_SOUND.hersteller = hersteller.id
    UNION
    SELECT PC_GRAFIK.id, PC_GRAFIK.bild, PC_GRAFIK.modell_name, PC_GRAFIK.modell_nummer, komponente.Text, hersteller.Text
    FROM ( PC_GRAFIK_DB AS PC_GRAFIK )
    LEFT JOIN PC_KOMPONENTE AS komponente ON PC_GRAFIK.komponente = komponente.id
    LEFT JOIN PC_HERSTELLER AS hersteller ON PC_GRAFIK.hersteller = hersteller.id
    ORDER BY komponente.Text

    wenn man jetzt z.B. ORDER BY modell_name macht,
    funktioniert es und wie schon erwähnt, wenn man die UNION mit mit der zweiten Tabelle wegläßt
    sortiert es mir es auch nach komponente.Text
    Ich bin jetzt nicht sehr SQL Erfahren, vielleicht ist es nur eine Kleinigkeit
    die ich einfach zu UNION noch nicht weiß und für ein Spezi von euch reicht vielleicht einfach nur ein kurzer schrafer Blick über meine Zeilen ;-)

    ich wäre echt happy

    schönes WE für alle die es genießen dürfen
    Gruß
    Zen

  • #2
    Meine erste Antwort wäre: Lass "Komponente." im Order By weg.
    Leider hast Du aber 2 identische Feldnamen im Select.

    Vergib im ersten Select einen Spalten Alias für eine der "Text"-Spalten. (Sowieso sinnvoll)
    Verwende im Order by nicht den Namen der Spalte, sondern die Position, also "order by 5", wenn ich mich nicht verzählt hab.

    Ehrlich gesagt, ist mir nicht klar, was da genau passiert bzw. schief geht. Der Fehler deutet darauf hin, dass Order By bereits auf das Union Ergebnis angewendet wird. Von der Syntax her sollte es aber eigentlich nicht so sein.
    Wenn Du das Gesamtergebnis Menge A union Menge B sortieren willst, kannst Du auch schreiben:
    Select * from (
    A
    union
    B )
    Order by .. [Spaltenposition oder eindeutiger Feldname]

    Diese Anweisung wäre zumindest eindeutig und sollte problemlos funktionieren.
    Gruß, defo

    Comment


    • #3
      Hallo defo,

      vielen lieben Dank, du hast mir sehr weitergeholfen

      Originally posted by defo View Post
      Meine erste Antwort wäre: Lass "Komponente." im Order By weg.
      Leider hast Du aber 2 identische Feldnamen im Select.
      Ja, muß ich leider, sonst wird es noch mal komplizierter mit der Konfiguration,
      so habe ich einen bei id verknüpften Namen ein Standardtabellenformat gewählt,
      also Liste aller Hersteller, Liste aller Farben etc. sehen vom Aufbau immer gleich aus


      Originally posted by defo View Post
      Vergib im ersten Select einen Spalten Alias für eine der "Text"-Spalten. (Sowieso sinnvoll)
      Klasse, das scheint zu funktionieren, ich glaube das ist für das erste die beste Lösung, muß ich mal schauen wie ich das implementiert bekomme,
      denn das Problem bei meinem Projekt ist, daß alles generisch funktionieren muß
      Ich schreibe eine GUI für MySQL Datenbanken als Webanwendung,
      d.h. ich möchte anhand nur einer Konfigurationstabelle entscheiden wie eine Datenbank-Tabelle aufgebaut ist
      und welche Eigenschaften die einzelnen Spalten haben sollen,
      in diesem Zuge müssen natürlich auch die Suchabfragen automatisch generiert werden,
      also muß ich einen generellen Algorithmus für alle erdenklichen Kombinationen schreiben

      vielleicht zum besseren Verständnis, hier mal ein Beispiel (noch ohne union) für das Sammelthema Autonummern
      http://pl8s.catal0g.net


      Originally posted by defo View Post
      Verwende im Order by nicht den Namen der Spalte, sondern die Position, also "order by 5", wenn ich mich nicht verzählt hab.
      das hat auch funktioniert, wußte gar nicht, daß das geht hmm.. müßte eine ganze Menge umstricken
      aber vielleicht würde durch eine banale Indizierung einiges andere deutlich vereinfacht

      Originally posted by defo View Post
      Ehrlich gesagt, ist mir nicht klar, was da genau passiert bzw. schief geht. Der Fehler deutet darauf hin, dass Order By bereits auf das Union Ergebnis angewendet wird. Von der Syntax her sollte es aber eigentlich nicht so sein.
      Wenn Du das Gesamtergebnis Menge A union Menge B sortieren willst, kannst Du auch schreiben:
      Select * from (
      A
      union
      B )
      Order by .. [Spaltenposition oder eindeutiger Feldname]

      Diese Anweisung wäre zumindest eindeutig und sollte problemlos funktionieren.
      Das habe ich praktisch nicht ganz verstanden
      habe mal auf die schnelle folgendes versucht, funktioniert aber natürlich nicht

      SELECT id, bild, modell_name, modell_nummer
      FROM ( PC_SOUND_DB union PC_GRAFIK_DB )
      ORDER BY bild;

      Meldung: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'PC_GRAFIK_DB ) ORDER BY bild LIMIT 0, 30' at line 2

      Comment


      • #4
        Originally posted by ZENeca View Post
        SELECT id, bild, modell_name, modell_nummer
        FROM ( PC_SOUND_DB union PC_GRAFIK_DB )
        ORDER BY bild;
        A und B sollten 2 gültige SQL Statements/Mengen/Selects darstellen, gemäß Union Erfordernissen natürlich mit gleicher Feldanzahl und Typisierung.
        Du musst minimal die beiden Tabellen in den Klammern jeweils durch 'Select * from [table]' ersetzen (wenn beide die gleiche Struktur haben).
        Gruß, defo

        Comment


        • #5
          mal mit backtricks versucht?
          Code:
          `komponente`.Text

          Comment


          • #6
            Hallo,
            Originally posted by defo View Post
            ... Ehrlich gesagt, ist mir nicht klar, was da genau passiert bzw. schief geht. Der Fehler deutet darauf hin, dass Order By bereits auf das Union Ergebnis angewendet wird. Von der Syntax her sollte es aber eigentlich nicht so sein.
            Doch! Die UNION-Syntax ist eine spezielle Ausführung des SELECT und ist im Endeffekt EINE Abfrage und nicht etwa eine Kombination. Damit hat diese Abfrage auch nur EINE ORDER BY-Klausel (Das Sortieren der Unterabfragen für sich ist auch irgendwie sinnlos).
            Da sich das ORDER BY also auf die gesamte Abfrage (und nicht nur auf den zweiten Teil) bezieht, ist schnell klar, dass es dort keine Entität "komponente" gibt.
            Für die korrekte Ausführung musst du hier das "komponente" weglassen, da die Spalte nur "Text" heist und keinen weiteren Qualifier zulässt.
            Damit kommt aber...
            Originally posted by defo View Post
            ...Vergib im ersten Select einen Spalten Alias für eine der "Text"-Spalten. (Sowieso sinnvoll)
            Verwende im Order by nicht den Namen der Spalte, sondern die Position, also "order by 5", wenn ich mich nicht verzählt hab.
            zum tragen. Die Spalte "Text" ist "ambiguous" - nicht eindeutig. Du MUSST hier einen Alias vergeben, wenn du eine dieser Spalten anderweitig referenzieren willst.
            Das ORDER BY <position> ist möglich, bereitet aber immer wieder Probleme wenn sich der Select-Teil mal ändert, da man dann gerne vergisst die Position neu auszuzählen .

            Korrekte Syntax:
            [highlight=sql]
            SELECT PC_SOUND.id, PC_SOUND.bild, PC_SOUND.modell_name, PC_SOUND.modell_nummer,
            komponente.Text kompo_text, hersteller.Text herst_text
            FROM ( PC_SOUND_DB AS PC_SOUND )
            LEFT JOIN PC_KOMPONENTE AS komponente ON PC_SOUND.komponente = komponente.id
            LEFT JOIN PC_HERSTELLER AS hersteller ON PC_SOUND.hersteller = hersteller.id
            UNION
            SELECT PC_GRAFIK.id, PC_GRAFIK.bild, PC_GRAFIK.modell_name, PC_GRAFIK.modell_nummer, komponente.Text, hersteller.Text
            FROM ( PC_GRAFIK_DB AS PC_GRAFIK )
            LEFT JOIN PC_KOMPONENTE AS komponente ON PC_GRAFIK.komponente = komponente.id
            LEFT JOIN PC_HERSTELLER AS hersteller ON PC_GRAFIK.hersteller = hersteller.id
            ORDER BY kompo_text
            [/highlight]

            Wenn (warum auch immer) der zweite Teil sortiert werden soll - Klammern setzen:
            [highlight=sql]
            SELECT PC_SOUND.id, PC_SOUND.bild, PC_SOUND.modell_name, PC_SOUND.modell_nummer,
            komponente.Text kompo_text, hersteller.Text herst_text
            FROM ( PC_SOUND_DB AS PC_SOUND )
            LEFT JOIN PC_KOMPONENTE AS komponente ON PC_SOUND.komponente = komponente.id
            LEFT JOIN PC_HERSTELLER AS hersteller ON PC_SOUND.hersteller = hersteller.id
            UNION
            (SELECT PC_GRAFIK.id, PC_GRAFIK.bild, PC_GRAFIK.modell_name, PC_GRAFIK.modell_nummer, komponente.Text, hersteller.Text
            FROM ( PC_GRAFIK_DB AS PC_GRAFIK )
            LEFT JOIN PC_KOMPONENTE AS komponente ON PC_GRAFIK.komponente = komponente.id
            LEFT JOIN PC_HERSTELLER AS hersteller ON PC_GRAFIK.hersteller = hersteller.id
            ORDER BY komponente.Text)
            [/highlight]
            Anmerkung hierzu: Da UNION implizit ein DISTINCT aller Datensätze macht, ist eine Sortierung der einzelnen Selects ohne Sortierung des Gesamtergebnisses nicht sinnvoll und bringt höchstwahrscheinlich nicht das Ergebniss das man sich erhofft hat.

            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
              Hi Falk,

              vorab besten Dank für die ausführliche theoretische Exkursion

              Originally posted by Falk Prüfer View Post
              Hallo,

              Die Spalte "Text" ist "ambiguous" - nicht eindeutig. Du MUSST hier einen Alias vergeben, wenn du eine dieser Spalten anderweitig referenzieren willst.
              Das ORDER BY <position> ist möglich, bereitet aber immer wieder Probleme wenn sich der Select-Teil mal ändert, da man dann gerne vergisst die Position neu auszuzählen .


              Korrekte Syntax:
              [highlight=sql]
              SELECT PC_SOUND.id, PC_SOUND.bild, PC_SOUND.modell_name, PC_SOUND.modell_nummer,
              komponente.Text kompo_text, hersteller.Text herst_text
              FROM ( PC_SOUND_DB AS PC_SOUND )
              LEFT JOIN PC_KOMPONENTE AS komponente ON PC_SOUND.komponente = komponente.id
              LEFT JOIN PC_HERSTELLER AS hersteller ON PC_SOUND.hersteller = hersteller.id
              UNION
              SELECT PC_GRAFIK.id, PC_GRAFIK.bild, PC_GRAFIK.modell_name, PC_GRAFIK.modell_nummer, komponente.Text, hersteller.Text
              FROM ( PC_GRAFIK_DB AS PC_GRAFIK )
              LEFT JOIN PC_KOMPONENTE AS komponente ON PC_GRAFIK.komponente = komponente.id
              LEFT JOIN PC_HERSTELLER AS hersteller ON PC_GRAFIK.hersteller = hersteller.id
              ORDER BY kompo_text
              [/highlight]
              das hatte ich ja schon auf defos Empfehlung hin gemacht, nur ein bisschen anders, ich habe in beiden UNIONS ein Alias vergeben
              aber das scheint gar nicht nötig zu sein, denn ich habe deinen Syntax gerade ausprobiert under funzt auch
              nur verstehe ich nicht ganz, warum der dann wirklich beide sortiert und nicht durcheinander kommt?
              gibst du damit quasi einfach nur die Spalte an und er sortiert das gesamtergebnis der Spalte, weil er nicht anders kann
              also dein eingangshinweis zum Tragen kommt, daß es sich bei UNION letztlich nur um eine Abfrage handelt?
              Interessant finde ich es auch, daß du deinen Alias ohne AS angibst,
              ist das an der Stelle mit AS (wie beim Alias zur Tabelle in einem FROM) falsch oder einfach nicht notwendig?

              Originally posted by Falk Prüfer View Post

              Wenn (warum auch immer) der zweite Teil sortiert werden soll - Klammern setzen:
              ne, hast du schon richtig verstanden, will natürlich das gesamtergebnis sortieren

              Originally posted by Falk Prüfer View Post
              Anmerkung hierzu: Da UNION implizit ein DISTINCT aller Datensätze macht, ist eine Sortierung der einzelnen Selects ohne Sortierung des Gesamtergebnisses nicht sinnvoll und bringt höchstwahrscheinlich nicht das Ergebniss das man sich erhofft hat.

              Gruß Falk
              jetzt hat sich noch ein eigenartiges, wenn auch ein deutlich unkomplizierteres Ergebnis mit UNION gezeigt

              Mache ich folgende Abfrage:

              [highlight=sql]
              SELECT grafik.modell_name FROM ( PC_GRAFIK_DB AS grafik )
              [/highlight]

              bekomme ich folgende Antwort:

              Millenium 2
              Millenium 2
              Millenium 2
              Millenium 2
              Super VGA
              V7 Vega plus
              vi711a

              mache ich mein UNION:

              [highlight=sql]
              SELECT sound.modell_name FROM ( PC_SOUND_DB AS sound )
              union
              SELECT grafik.modell_name FROM ( PC_GRAFIK_DB AS grafik )
              [/highlight]

              komme ich auf das Ergebnis:

              Live Value Player
              AI-101
              3D - Stereo
              Millenium 2
              Super VGA
              V7 Vega plus
              vi711a

              warum zeigt er Millenium 2 nur ein mal an??
              wenn ich ihn z.B. noch die id ausgeben lasse sind sie wieder alle dabei
              Wie kommt der dazu ohne explizite Aufforderung die Hälfte wegzulassen
              vor allem nur beim UNION?
              bzw. wie kann ich ihn anhalten nichts zu unterschlagen?

              Comment


              • #8
                Originally posted by ZENeca View Post
                warum zeigt er Millenium 2 nur ein mal an??
                wenn ich ihn z.B. noch die id ausgeben lasse sind sie wieder alle dabei
                Wie kommt der dazu ohne explizite Aufforderung die Hälfte wegzulassen
                vor allem nur beim UNION?
                bzw. wie kann ich ihn anhalten nichts zu unterschlagen?
                Das hat Falk ja schon geschrieben, Du hast es selbst zitiert. UNION macht immer ein Distinct, heisst es schafft die eindeutige Vereinigungsmenge. Willst Du das nicht, musst Du UNION ALL statt UNION verwenden.

                Ebenfalls schönen Dank an Falk, dass er meine Spekulationen gerade gerückt hat.
                Gruß, defo

                Comment


                • #9
                  Hallo,
                  Originally posted by ZENeca View Post
                  ...vorab besten Dank für die ausführliche theoretische Exkursion
                  Gern doch ...

                  Originally posted by ZENeca View Post
                  ...gibst du damit quasi einfach nur die Spalte an und er sortiert das gesamtergebnis der Spalte, weil er nicht anders kann
                  also dein eingangshinweis zum Tragen kommt, daß es sich bei UNION letztlich nur um eine Abfrage handelt?
                  Wie ich es sagte, die UNION-Syntax ist eine spezielle Form des Selects. Es ist EINE Abfrage, nicht zwei (oder mehr)!

                  Originally posted by ZENeca View Post
                  ... Interessant finde ich es auch, daß du deinen Alias ohne AS angibst,
                  ist das an der Stelle mit AS (wie beim Alias zur Tabelle in einem FROM) falsch oder einfach nicht notwendig?
                  Beide AS sind optional, sowohl für den Tabellen- als auch für den Spaltenalias.
                  Originally posted by http://dev.mysql.com/doc/refman/5.5/en/select.html
                  The AS keyword is optional when aliasing a select_expr with an identifier.
                  Originally posted by http://dev.mysql.com/doc/refman/5.5/en/select.html
                  For each table specified, you can optionally specify an alias.
                  tbl_name [[AS] alias] [index_hint]
                  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


                  • #10
                    Originally posted by defo View Post
                    Das hat Falk ja schon geschrieben, Du hast es selbst zitiert. UNION macht immer ein Distinct, heisst es schafft die eindeutige Vereinigungsmenge. Willst Du das nicht, musst Du UNION ALL statt UNION verwenden.

                    Ebenfalls schönen Dank an Falk, dass er meine Spekulationen gerade gerückt hat.
                    ja, den Begriff DISTICT kannte ich auch noch nicht, habe mich schon immer gefragt wie es zu realisieren bestimmte Redundanzen zu unterdrücken,
                    obwohl mich in dem Zusammenhang eher interessiert, ob man das auf bestimmte Spalten reduzieren kann,
                    also, wenn ich ein SELECT A, B, C FROM ... mache und möchte aber, daß alle A - B Kombinationen die gleich sind nur ein mal aufgeführt werden
                    geht das?
                    Habe ich das überhaupt verständlich dargestellt?

                    ...eigentlich gehört das ja auch überhaupt nicht in diesen Threat,

                    aber eine Sache bekomme ich mit einem UNION noch nicht hin und zwar die Kombination mit HAVING

                    im Prinzip will ich von meiner letzte Suche

                    [highlight=sql]
                    SELECT grafik.modell_name
                    FROM ( PC_GRAFIK_DB AS grafik )
                    UNION ALL
                    SELECT sound.modell_name
                    FROM ( PC_SOUND_DB AS sound )
                    [/highlight]

                    jede n-te Zeile ausgeben
                    ohne UNION habe ich das wie folgt hinbekommen
                    (beispiel für jede 10. seite)

                    [highlight=sql]
                    SELECT grafik.modell_name
                    FROM ( PC_GRAFIK_DB AS grafik )
                    HAVING (@row := @row +1) %10 =0
                    [/highlight]

                    und theorteisch gehört das HAVING ja zum SELECT ?
                    also

                    SELECT ... FROM ... HAVING ... UNION ALL SELECT ... FROM ... HAVING ... etc

                    also habe ich analog dazu:

                    [highlight=sql]
                    SELECT grafik.modell_name
                    FROM ( PC_GRAFIK_DB AS grafik )
                    HAVING (@row := @row +1) %10 =0
                    UNION ALL
                    SELECT sound.modell_name
                    FROM ( PC_SOUND_DB AS sound )
                    HAVING (@row := @row +1) %10 =0
                    [/highlight]

                    aber das klappt irgendwie nicht
                    der macht da quatsch, selbst wenn ich jeden zweiten Datensatz ausgeben will
                    bekomme ich nur einen Treffer und das müssten mehr sein.
                    müsste ich das vielleicht einfach nur anders klammern, damit sich das HAVING nur auf das Endergebnis bezieht?
                    oder muß ich das irgend wie in meinem multi-query (mysqli) berücksichtigen
                    das isch bis jetzt wie folgt gelöst habe

                    PHP Code:
                    function list_idx($search_string$sets_per_page){

                      
                    $mysqli = new mysqli(HOSTUSERPASSWDDBNAME);
                      
                    $sql = <<<SQL  SET names 'utf8';  
                                     
                    SET @row:= $sets_per_page-1;   
                                
                    SQL;
                      if(!
                    $mysqli->multi_query($sql))
                        die(
                    "Konnte erstes Kommando nicht ausführen: \n $search_string \n" $mysqli->error);
                      do{
                      
                    // Ergebnisse durchlaufen, aber nicht auswerten, damit
                      // später weitere Abfragen ausgeführt werden können
                        
                    if($result $mysqli->store_result()){
                          while(
                    $data $result->fetch_row());
                          
                    $result->close();
                        }
                      } while(
                    $mysqli->next_result());

                    /*** Anfang: Abfragen mit Ergebnisressourcen ***/
                      
                    if(!$mysqli->multi_query($search_string))
                        die(
                    "Konnte zweites Kommando nicht ausführen: \n $search_string \n" $mysqli->error);
                      do  {
                        if(
                    $result $mysqli->store_result())  {
                          while(
                    $data $result->fetch_row())  {
                            
                    $register[] = $data[0];
                          }
                          
                    $result->close();
                        }
                      } while(
                    $mysqli->next_result());
                      
                    $mysqli->close();
                      return 
                    $register;

                    @defo: Auch wenn das Sortieren nach Spaltennummer unorthodox ist
                    möchte ich mich doch noch mal für den Tip bedanken, war zwar alles andere als einfach das umzustellen,
                    aber für meine Softwarelösung, die Abfragen ja generisch anhand einer Konfigurationstabelle generieren muß
                    macht schon vieles deutlich einfacher, einziger Währmutstropfen ist genau das was Falk gemeint hat,
                    man muß aufpassen, daß man beim Einfügen (oder umorganisieren) von Spalten, die Zahlen überarbeitet,
                    aber die stehen ja auch in der Konfiguration und müssen nur an einer Stelle geändert werden,
                    daß ich das für die einhergehende Vereinfachung, gerne in Kauf nehme

                    Comment


                    • #11
                      Vielleicht gehts ja so
                      [HIGHLIGHT="SQL"]SELECT X.*
                      FROM ( SELECT grafik.modell_name
                      FROM ( PC_GRAFIK_DB AS grafik )
                      UNION ALL
                      SELECT sound.modell_name
                      FROM ( PC_SOUND_DB AS sound )
                      ) AS X
                      HAVING (@ROW := @ROW +1) %10 [/HIGHLIGHT]

                      Comment


                      • #12
                        Originally posted by ebis View Post
                        Vielleicht gehts ja so
                        [HIGHLIGHT="SQL"]SELECT X.*
                        FROM ( SELECT grafik.modell_name
                        FROM ( PC_GRAFIK_DB AS grafik )
                        UNION ALL
                        SELECT sound.modell_name
                        FROM ( PC_SOUND_DB AS sound )
                        ) AS X
                        HAVING (@ROW := @ROW +1) %10 [/HIGHLIGHT]
                        YES!
                        und läuft *froi
                        Danke!

                        Comment


                        • #13
                          Hallo,
                          Originally posted by ZENeca View Post
                          j...wenn ich ein SELECT A, B, C FROM ... mache und möchte aber, daß alle A - B Kombinationen die gleich sind nur ein mal aufgeführt werden
                          geht das?
                          Ja, das geht und ist z.B. hier: Bei "doppelten" Datensätzen nur einen anzeigen beschrieben.

                          Originally posted by ZENeca View Post
                          j...aber das klappt irgendwie nicht
                          Das ist zwar keine Fehlerbeschreibung , aber wundern tut es mich nicht. Ich wüsste nicht mal, was ich bei dieser Abfrage überhaupt erwarten würde.
                          Offensichtlich hast du das eine oder andere auch noch nicht verstanden, bzw. ohne zu Überlegen irgendwelche Scriptfragmente übernommen.
                          Zuerstmal macht ein HAVING ohne Gruppierung und ohne Aggregatfunktion überhaupt keinen Sinn. Hier sollte einfach nur ein WHERE verwendet werden.
                          Das Konstrukt "@ROW := @ROW +1" erhöht bei jedem Aufruf die Session-Variable @ROW um Eins. In welcher Reihenfolge MySQL bei einem UNION jedoch die einzelnen Selects ausführt und wann da demzufolge diese Erhöhung stattfindet, möchte ich jetzt nicht mutmaßen. Um auf Nummer sicher zu gehen, würde ich dann doch, wie ebis, das Ganze in einem Subselect verwenden - aber eben mit where statt having.

                          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


                          • #14
                            Originally posted by Falk Prüfer View Post
                            Hallo,

                            Ja, das geht und ist z.B. hier: Bei "doppelten" Datensätzen nur einen anzeigen beschrieben.


                            Das ist zwar keine Fehlerbeschreibung , aber wundern tut es mich nicht. Ich wüsste nicht mal, was ich bei dieser Abfrage überhaupt erwarten würde.
                            Offensichtlich hast du das eine oder andere auch noch nicht verstanden, bzw. ohne zu Überlegen irgendwelche Scriptfragmente übernommen.
                            Zuerstmal macht ein HAVING ohne Gruppierung und ohne Aggregatfunktion überhaupt keinen Sinn. Hier sollte einfach nur ein WHERE verwendet werden.
                            Das Konstrukt "@ROW := @ROW +1" erhöht bei jedem Aufruf die Session-Variable @ROW um Eins. In welcher Reihenfolge MySQL bei einem UNION jedoch die einzelnen Selects ausführt und wann da demzufolge diese Erhöhung stattfindet, möchte ich jetzt nicht mutmaßen. Um auf Nummer sicher zu gehen, würde ich dann doch, wie ebis, das Ganze in einem Subselect verwenden - aber eben mit where statt having.

                            Gruß Falk
                            Stimmt, SQL ist bestimmt nicht meine Generaldisziplin und da gibt es sicher noch einiges für mich zu lernen
                            und das HEAVING habe ich nur genommen, weil ich dies mal im Zusammenhang mit Programmiersquenzen gesehen habe
                            und wurde dort auch als quasi "WHERE" Bedingung genutzt, habe das dann auch nicht weiter verfolgt weil es funktioniert hat,
                            habe erst auf deinen Hinweis mal recherchiert was der Unterschied ist.
                            Die Programmsequenz habe ich natürlich selber geschrieben und die ist auch ganz einfach zu erklären.
                            Ziel war es, jede n-te Zeile auszugeben.
                            Mit jeder Zeile zählt er sein ROW hoch und teilt es modal durch die Anzahl der Spalten die er auslassen soll
                            dann prüft er den modalen Rest auf 0 was natürlich bei jeder 10. Zeile der Fall ist
                            hat auch sofort funktioniert
                            ...und ich könnte jetzt auch einfach WHERE ... AND ... AND (@row := @row +1) %10 =0 schreiben?
                            habe es gerade probiert, er hat sich jetzt nicht beschwert, kommt aber auf andere (falsche) Ergebnisse,
                            werde ich mal in Ruhe überprüfen, wenn ich ein bißchen mehr Zeit habe

                            Comment


                            • #15
                              Originally posted by ebis View Post
                              Vielleicht gehts ja so
                              [HIGHLIGHT="SQL"]SELECT X.*
                              FROM ( SELECT grafik.modell_name
                              FROM ( PC_GRAFIK_DB AS grafik )
                              UNION ALL
                              SELECT sound.modell_name
                              FROM ( PC_SOUND_DB AS sound )
                              ) AS X
                              HAVING (@ROW := @ROW +1) %10 [/HIGHLIGHT]
                              ich komm da nicht mehr an Spalten die nicht im SELECT aufgeführt sind
                              ...also ohne UNON kann man z.B.:

                              [HIGHLIGHT="SQL"]
                              SELECT PL8.joker_text
                              FROM ( PL8_DB AS PL8 )
                              WHERE `is` = 1 AND `konst_text` LIKE '%andorra%'
                              [/HIGHLIGHT]

                              da habe ich nur den joker_text im SELECT, kann aber andere Spalten der Tabelle für Bedingungen heranziehen
                              habe jetzt einiges ausprobiert, z.B. folgende Versuche waren erfolglos ....WHERE X.konst_text LIKE '%andorra%'
                              nur sobald man konst_text im SELECT aufnimmt geht's
                              aber einfach so bekomme ich das mit einer solchen Verschahtelung einfach nicht mehr gebacken

                              Comment

                              Working...
                              X