JO: MySQL: Subselects übergreifend

SELECT  
IFNULL(subcats, catid)  
FROM  
(SELECT t3.id AS catid FROM cats AS t3 WHERE t3.name='Akrobatik') AS ids,  
(SELECT t1.name AS subcats  FROM cats AS t1  WHERE t1.subcategoryid = catid) AS names

Dieser Query klappt nicht:
Unknown column 'catid' in 'where clause'

IFNULL müsste catid kennen.
Warum kennt der zweite Subselect es nicht.

Hier die Tabelle Kategorien:
id subid name
1  0     sport
2  1     handball
3  2     akrobatik
4  3     fussball

Query-Pseudo:
Lies die ID der Kategorie mit dem Namen "Akrobatik" aus, anschließend lies alle Kategorien aus die als UnterkategorieID den Wert von "Akrobatiks"-ID haben. Wenn es Unterkategorien gibt, gebe sie zurück, wenn nicht, gebe die ID zurück.

Ich möchte es irgendwie mit einem Query machen.

Grüße, jo

  1. Hi!

    SELECT

    IFNULL(subcats, catid)
    FROM
    (SELECT t3.id AS catid FROM cats AS t3 WHERE t3.name='Akrobatik') AS ids,
    (SELECT t1.name AS subcats  FROM cats AS t1  WHERE t1.subcategoryid = catid) AS names

    
    >   
    > Dieser Query klappt nicht:  
    > Unknown column 'catid' in 'where clause'  
      
    Alias-Namen und andere Dinge aus der SELECT-Klausel stehen in der WHERE-Klausel noch nicht zur Verfügung oder besser gesagt: zum Zeitpunt der WHERE-Klausel-Auswertung) erst HAVING kann darauf zugreifen. Außerdem bist du hier erst im FROM und ohne dass bereits eine Verknüpfung ausgeführt wurde. Die beiden Teilmengen müssen sich unabhängig voneinander ermitteln lassen. Erst dann kann man sie miteinander in Verbindung bringen (im äußeren WHERE oder durch Joins). Reicht das fürs erste, damit du weißt, in welche Richtung der Umbau der Query gehen muss?  
      
      
    Lo!
    
    1. Hi!

      SELECT

      IFNULL(subcats, catid)
      FROM
      (SELECT t3.id AS catid FROM cats AS t3 WHERE t3.name='Akrobatik') AS ids,
      (SELECT t1.name AS subcats  FROM cats AS t1  WHERE t1.subcategoryid = catid) AS names

      
      > >   
      > > Dieser Query klappt nicht:  
      > > Unknown column 'catid' in 'where clause'  
      >   
      > Alias-Namen und andere Dinge aus der SELECT-Klausel stehen in der WHERE-Klausel noch nicht zur Verfügung oder besser gesagt: zum Zeitpunt der WHERE-Klausel-Auswertung) erst HAVING kann darauf zugreifen. Außerdem bist du hier erst im FROM und ohne dass bereits eine Verknüpfung ausgeführt wurde. Die beiden Teilmengen müssen sich unabhängig voneinander ermitteln lassen. Erst dann kann man sie miteinander in Verbindung bringen (im äußeren WHERE oder durch Joins). Reicht das fürs erste, damit du weißt, in welche Richtung der Umbau der Query gehen muss?  
        
        
      Nein weil ich ja nur den Namen einer Kategorie geleifert bekomme. Verstehe nicht wie ich das unabhängig voneinander machen soll. Du musst dazu wissen ich habe gestern schon zwei Stunden nur in diesen Query gesteckt und ursprünglich war das mal ein Join gewurschtel.  
      Bitte machs noch etwas deutlicher.  
        
      Gruß , jo
      
      1. Mahlzeit Jo,

        bitte zitiere nur den Teil des Beitrags, auf den Du Dich beziehst - und nicht pauschal alles. Das macht Beiträge für andere extrem schwer bis kaum noch lesbar. Danke.

        Nein weil ich ja nur den Namen einer Kategorie geleifert bekomme. Verstehe nicht wie ich das unabhängig voneinander machen soll. Du musst dazu wissen ich habe gestern schon zwei Stunden nur in diesen Query gesteckt und ursprünglich war das mal ein Join gewurschtel.

        Das ist vielleicht jetzt etwas hart ... aber es ist völlig unerheblich, wieviel Zeit Du bereits in eine nicht funktionierende Abfrage investiert hast. Relevant ist einzig und allein, was Du als Ergebnis haben willst.

        Bitte machs noch etwas deutlicher.

        Dazu fehlen Deinerseits noch konkrete Angaben (deswegen habe ich in meiner ersten Antwort auch nur vermuten können). Zeige also einfach mal

        1.) die Struktur Deiner vorhandenen Tabellen, z.B. in folgender Form:

        ID | Name | Foo
        ----+------+------
         42 | bla  | blubb
         23 | tröt | laber

        2.) die Struktur des von Dir gewünschten Ergebnisses (wiederum in Tabellenform - irgendwelches "Pseudo-SQL" nützt meistens wenig bis gar nichts) ... inkl. Erklärung, welche Spalte aus welcher Tabelle kommen soll bzw. sich aus welcher Berechnung ergeben soll.

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  2. Mahlzeit JO,

    SELECT

    IFNULL(subcats, catid)
    FROM
    (SELECT t3.id AS catid FROM cats AS t3 WHERE t3.name='Akrobatik') AS ids,
    (SELECT t1.name AS subcats  FROM cats AS t1  WHERE t1.subcategoryid = catid) AS names

      
    
    > Warum kennt der zweite Subselect es nicht.  
      
    Weil zuerst die Sub-Queries ausgewertet werden und deren Ergebnis dann in der äußeren Abfrage verwurstet wird. Das bedeutet aber zwangsläufig auch, dass die einzelnen Sub-Queries nichts voneinander wissen - insbesondere keine Spaltennamen oder -inhalte.  
      
      
    
    > Hier die Tabelle Kategorien:  
      
    Eine Tabelle "Kategorien" finde ich in Deinem SQL-Code nicht. Was soll das für eine sein?  
      
      
    
    > Query-Pseudo:  
    > Lies die ID der Kategorie mit dem Namen "Akrobatik" aus, anschließend lies alle Kategorien aus die als UnterkategorieID den Wert von "Akrobatiks"-ID haben. Wenn es Unterkategorien gibt, gebe sie zurück, wenn nicht, gebe die ID zurück.  
      
    Warum versuchst Du es über Sub-Queries? Was hast Du gegen "klassische" JOINs? :-)  
      
      
    
    > Ich möchte es irgendwie mit einem Query machen.  
      
    Das geht ja auch:  
      
    ~~~sql
    SELECT IFNULL(t1.name, t3.id) AS name  
      FROM cats      AS t3  
      LEFT JOIN cats AS t1 ON t1.subcategoryid = t3.id  
     WHERE t3.name = 'Akrobatik'
    

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|