wahsaga: MySQL Row Subquery - wie Ergebnis "Spalten" zuweisen?

hi,

ich ermittle mit einer Subquery _zwei_ Spaltenwerte. Es handelt sich also nicht mehr um eine skalare Subquery, sondern um das, was MySQL eine Row Subquery nennt.

Nur, wie weise ich jetzt deren Ergebnis zwei Aliasnamen in meinem umgebenden SELECT-Statement zu?

Bei einer skalaren Subquery würde ich ja wie folgt vorgehen:

  
SELECT blubb,  
   ( SELECT blah1 FROM ... ) AS blah  
FROM ...

Aber wie mache ich das mit einer Row Subquery, die mir zwei Werte liefert?

  
SELECT blubb,  
   ( SELECT blah1, quark1 FROM ... ) AS what_goes_here???  
FROM ...

( SELECT blah1, quark1 FROM ... ) AS blah, quark
"funzt" nicht - erwartungsgemäß, Fehlermeldung "Operand should contain 1 column(s)".

( SELECT blah1, quark1 FROM ... ) AS (blah, quark)
geht genauso wenig,
" 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 '(blah, quark)'".

Einen "Row Constructor", wie auf der Seite über Row Subqueries beschrieben, an dieser Stelle einzusetzen, gelingt mir auch nicht - dort gibt es nur Beispiele, wo dieser in der WHERE-Klausel auftaucht - auch wenn dort steht "they are legal in other contexts as well."

( SELECT blah1, quark1 FROM ... ) AS ROW(blah, quark)
oder auch das mir selbst abwegig erscheinende
SELECT blubb,  ROW(blah, quark) = ( SELECT blah1, quark1 FROM ... )
ergeben ebenfalls nur Fehler.

Wie macht man das "richtig"? Gibt es überhaupt eine Möglichkeit?
Oder habe ich keine andere Wahl, als beide Werte in der Subquery mit einem CONCAT zu verknüpfen, mir als einen Wert zurückliefern zu lassen, und sie anschließend wieder auseinanderzupflücken?

MySQL-Version ist MySQL - 4.1.18-nt

gruß,
wahsaga

--
/voodoo.css:
#GeorgeWBush { position:absolute; bottom:-6ft; }
  1. Hi,

    Wie macht man das "richtig"?

    das weiß ich zwar nicht, aber mir fällt noch ein (zu?) trivialer Versuch ein:

    SELECT blubb, (SELECT blah1 AS blah, quark1 AS quark FROM ...)

    Oder habe ich keine andere Wahl, als beide Werte in der Subquery mit einem CONCAT zu verknüpfen, mir als einen Wert zurückliefern zu lassen, und sie anschließend wieder auseinanderzupflücken?

    Eieiei. Ich hoffe, es gibt Alternativen ;-)

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. hi,

      das weiß ich zwar nicht, aber mir fällt noch ein (zu?) trivialer Versuch ein:

      SELECT blubb, (SELECT blah1 AS blah, quark1 AS quark FROM ...)

      Liefert leider den bereits aus meinem ersten Test bekannten Fehler "#1241 - Operand should contain 1 column(s)".

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
  2. Hallo,

    ich ermittle mit einer Subquery _zwei_ Spaltenwerte. Es handelt sich also nicht mehr um eine skalare Subquery, sondern um das, was MySQL eine Row Subquery nennt.

    Nur, wie weise ich jetzt deren Ergebnis zwei Aliasnamen in meinem umgebenden SELECT-Statement zu?

    Bei einer skalaren Subquery würde ich ja wie folgt vorgehen:

    SELECT blubb,
       ( SELECT blah1 FROM ... ) AS blah
    FROM ...

    
    >   
    > Aber wie mache ich das mit einer Row Subquery, die mir zwei Werte liefert?  
    
    Soweit ich weiß, an dieser Stelle gar nicht. Gerne in WHERE-Klauseln usw. aber die Spaltenaufzählung nach SELECT erwartet \_einzene\_ Spaltendefinitionen oder \* für alle Spalten der Tabelle/n nach FROM.  
      
    
    > ~~~sql
      
    
    > SELECT blubb,  
    >    ( SELECT blah1, quark1 FROM ... ) AS what_goes_here???  
    > FROM ...
    
    
      
    SELECT blubb,  
        ( SELECT blah1 FROM ... ) AS blah,  
        ( SELECT quark1 FROM ... ) AS quark  
    FROM ...  
    
    

    Wie macht man das "richtig"? Gibt es überhaupt eine Möglichkeit?
    Oder habe ich keine andere Wahl, als beide Werte in der Subquery mit einem CONCAT zu verknüpfen, mir als einen Wert zurückliefern zu lassen, und sie anschließend wieder auseinanderzupflücken?

    siehe oben

    Je nach Zusammenhang zwischen den Tabellen eventuell auch mit einenm JOIN, also mehreren Tabellen nach FROM.

    viele Grüße

    Axel

    1. hi,

      SELECT blubb,
          ( SELECT blah1 FROM ... ) AS blah,
          ( SELECT quark1 FROM ... ) AS quark
      FROM ...

        
      Damit müsste ich ja die Subquery, die mir den gewünschten Datensatz auswählt, aus dem ich sowohl den Inhalt von blah als auch von quark haben möchte, zweimal ausführen - erscheint mir nicht sonderlich performant.  
        
      
      > Je nach Zusammenhang zwischen den Tabellen eventuell auch mit einenm JOIN, also mehreren Tabellen nach FROM.  
        
      Erscheint mir auch weniger performant, als per Subquery - zumal ich insgesamt ja nur einen einzigen Datensatz in der Ergebnismenge bekommen möchte.  
        
        
      Habe mir jetzt erstmal mit CONCAT\_WS geholfen, mit einem Trennzeichen, welches in den Daten ganz sicher nicht vorkommt - und nehme dann den Wert dieser Spalte anschließend im verarbeitenden Script wieder auseinander.  
        
      gruß,  
      wahsaga  
        
      
      -- 
      /voodoo.css:  
      #GeorgeWBush { position:absolute; bottom:-6ft; }
      
  3. echo $begrüßung;

    ich ermittle mit einer Subquery _zwei_ Spaltenwerte.
    Nur, wie weise ich jetzt deren Ergebnis zwei Aliasnamen in meinem umgebenden SELECT-Statement zu?

    Man kann auch Subqueries in the FROM clause angeben. Hast du damit schon experimentiert?

    echo "$verabschiedung $name";

    1. hi,

      Man kann auch Subqueries in the FROM clause angeben. Hast du damit schon experimentiert?

      Ja, hatte ich mir auch schon angesehen - bin aber auf keinen brauchbaren Ansatz gekommen, wie ich das im konkreten Falle nutzen könnte. Ich möchte ja einen Datensatz aus der Tabelle vollständig auslesen, und dann per Subquery zwei Felder des bei zeitlicher Sortierung direkt nachfolgenden bzw. vorhergehenden Datensatzes als weitere Felder zu diesem Datensatz hinzufügen.

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }