Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] SELECT verschachtelt

Einklappen

Neue Werbung 2019

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

  • [Erledigt] SELECT verschachtelt

    Hallo allerseits,

    ich habe ein Problem mit einer verschachtelten Select-Abfrage.

    Code:
    Tabelle nodes (Prim: id):
    -------------------------
    id	user
    -------------------------
    1	Mustermann
    2	Mustermann
    Code:
    Tabelle nodes_tags (Prim: node_id, k)
    -----------------------------------------------
    node_id		k   		v
    -----------------------------------------------
    1		'title'		'Kongress xy'
    1		'date_start'	'19.08.2010'
    2       	'title'		'Tagung z'
    2		'date_start'	'20.08.2010'
    Das Ergebnis soll so aussehen:

    Code:
    -----------------------------------------------------------
    id	user              title           date_start
    ----------------------------------------------------------
    1      Mustermann    Kongress xy      19.08.2010
    2      Mustermann    Tagung z         20.08.2010
    Folgende Abfragen will ich durchführen, d.h. ich will alle Infos aus beiden Tabellen, die zu einer id gehören in einer Zeile darstellen.

    Code:
    SELECT 
      n.id as id, 
      n.user as user, 
      (SELECT t.v FROM evt_node_tags t WHERE t.node_id=n.id and k='title') as title, 
      (SELECT t.v FROM evt_node_tags t WHERE t.node_id=n.id and k='date_start') as date_start
    FROM evt_nodes n
    WHERE 
      user = 'Mustermann' 
      AND DATE_FORMAT(date_start, '%d.%m.%Y') >= DATE_FORMAT('18.08.2010', '%d.%m.%Y')
    Leider bekomme ich folgende Fehlermeldung:

    Code:
    #1054 - Unknown column 'date_start' in 'where clause'

    Wenn ich die letzte Zeile weglasse, werden alle Datensätze von Mustermann angezeigt. Also liegt der Fehler in der letzten Zeile. Am 'DATE_FORMAT' liegt's nicht, das hab ich schon überprüft sondern:

    Die where-Abfrage auf 'user' bezieht sich auf die erste Tabelle. Die Abfrage auf 'date_start' auf den Alias der verschachtelten Select-Abfrage für die zweite Tabelle.

    Geht das mit MySQL gar nicht? Wenn nicht, gibt es eine Alternative?

    Bin dankbar für Hinweise.

    Grüsse Wolfgang.


  • #2
    Warum mit Subqueries arbeiten, wenn es doch auch JOINs tun sollten?
    @fschmengler - @fschmengler - @schmengler
    PHP Blog - Magento Entwicklung - CSS Ribbon Generator

    Kommentar


    • #3
      Das habe ich auch schon versucht. Da habe ich dann das gleiche Problem. Das Problem ist die Tabellen-Struktur.

      Kommentar


      • #4
        Die Tabellenstruktur ist in der Tat merkwürdig aber möglich sollte das trotzdem sein:
        Code:
        SELECT 
          n.id as id, 
          n.user as user, 
          t_title.v as title,
          t_date.v as date_start
        FROM evt_nodes n
        LEFT JOIN evt_node_tags t_title ON t_title.node_id=n.id AND t_title.k='title'
        LEFT JOIN evt_node_tags t_date ON t_date.node_id=n.id AND t_date.k='date_start'
        WHERE 
          user = 'Mustermann' 
          AND STR_TO_DATE(date_start, '%d.%m.%Y') >= STR_TO_DATE('18.08.2010', '%d.%m.%Y')
        @fschmengler - @fschmengler - @schmengler
        PHP Blog - Magento Entwicklung - CSS Ribbon Generator

        Kommentar


        • #5
          Mit Joins hatte ich das auch schon versucht. Aber ich bekomme exakt die gleiche Fehlermeldung:

          Code:
          #1054 - Unknown column 'date_start' in 'where clause'
          Die Tabellenstruktur hat den Vorteil, dass ich mit einem Ident ('id') Datenobjekte mit unterschiedlichen Eigenschaften ansprechen kann. Solange ich Objekte mittels Eigenschaften (Spalten) der ersten Tabelle suche, funktioniert das auch, aber sobald ich versuche, in der where-clause die in Spalten umgewandelten 'Werte' der zweiten Tabelle zu verwenden, kommt diese Fehlermeldung.

          Das Problem dabei ist natürlich, dass 'Werte' der zweiten Tabelle zu 'Spalten' werden und bei manchen Objekten (Zeilen: id, ...) gar nicht existieren.

          Vielleicht geht das deshalb grundsätzlich bei MySql gar nicht?

          Kommentar


          • #6
            Nur, falls mal jemand probieren möchte, hier die Create/Insert-Answeisungen für die Tabellen:

            Code:
            --
            -- Tabellenstruktur für Tabelle `evt_nodes`
            --
            
            CREATE TABLE IF NOT EXISTS `evt_nodes` (
              `id` varchar(20) NOT NULL,
              `user` varchar(20) NOT NULL,
              PRIMARY KEY (`id`)
            ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
            
            --
            -- Daten für Tabelle `evt_nodes`
            --
            
            INSERT INTO `evt_nodes` (`id`, `user`) VALUES
            ('1', 'Mustermann'),
            ('2', 'Mustermann');
            
            -- --------------------------------------------------------
            
            --
            -- Tabellenstruktur für Tabelle `evt_node_tags`
            --
            
            CREATE TABLE IF NOT EXISTS `evt_node_tags` (
              `node_id` varchar(20) NOT NULL,
              `k` varchar(100) NOT NULL,
              `v` text NOT NULL,
              PRIMARY KEY (`node_id`,`k`)
            ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
            
            --
            -- Daten für Tabelle `evt_node_tags`
            --
            
            INSERT INTO `evt_node_tags` (`node_id`, `k`, `v`) VALUES
            ('1', 'title', 'Kongress xy'),
            ('1', 'date_start', '19.08.2010'),
            ('2', 'title', 'Tagung z'),
            ('2', 'date_start', '20.08.2010');

            Kommentar


            • #7
              Danke fab,

              es geht doch mit Deinem Vorschlag. Man muss nur dort in der letzten Zeile den Alias 'date_start' ersetzen durch 't_date.v'. Also so:

              Code:
              SELECT 
                n.id as id, 
                n.user as user, 
                t_title.v as title,
                t_date.v as date_start
              FROM evt_nodes n
              LEFT JOIN evt_node_tags t_title ON t_title.node_id=n.id AND t_title.k='title'
              LEFT JOIN evt_node_tags t_date ON t_date.node_id=n.id AND t_date.k='date_start'
              WHERE 
                user = 'Mustermann' 
                AND STR_TO_DATE(t_date.v, '%d.%m.%Y') >= STR_TO_DATE('18.08.2010', '%d.%m.%Y')
              Warum er den Alias nicht frisst, weiß ich jetzt nicht. Aber egal.

              Danke sehr jedenfalls!

              Kommentar


              • #8
                Zitat von wolf_007 Beitrag anzeigen
                Warum er den Alias nicht frisst, weiß ich jetzt nicht.
                MySQL :: MySQL 5.1 Reference Manual :: B.5.5.4 Problems with Column Aliases

                Kommentar

                Lädt...
                X