Ankündigung

Einklappen
Keine Ankündigung bisher.

Abfrage über mehrere Tabellen

Einklappen

Neue Werbung 2019

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

  • Abfrage über mehrere Tabellen

    Hallo

    Ich habe eine Datenbank wie folgt:

    Code:
    CREATE TABLE IF NOT EXISTS `features` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `feature` varchar(255) NOT NULL,
      `value` varchar(255) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
    
    INSERT INTO `features` (`id`, `feature`, `value`) VALUES
    (1, 'Farbe', 'Rot'),
    (2, 'Farbe', 'Grau'),
    (3, 'Material', 'Leder'),
    (4, 'Breite', '210cm'),
    (5, 'Farbe', 'Blau');
    
    CREATE TABLE IF NOT EXISTS `prod2feat` (
      `prod_id` int(11) NOT NULL,
      `feat_id` int(11) NOT NULL,
      KEY `prod_id` (`prod_id`,`feat_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    INSERT INTO `prod2feat` (`prod_id`, `feat_id`) VALUES
    (1, 1),
    (2, 1),
    (2, 3),
    (3, 2),
    (3, 5),
    (4, 4);
    
    CREATE TABLE IF NOT EXISTS `products` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
    
    INSERT INTO `products` (`id`, `name`) VALUES
    (1, 'Auto'),
    (2, 'Schuh'),
    (3, 'Schuh'),
    (4, 'Sofa'),
    (5, 'Hose');
    Der Inhalt der Datenbank sieht dann so aus:

    Code:
    SELECT *
    FROM `products` LEFT JOIN `prod2feat`
    ON `products`.`id` = `prod2feat`.`prod_id`
    LEFT JOIN `features`
    ON `prod2feat`.`feat_id` = `features`.`id`
    Ich habe also verschiedene Produkte mit verschiedenen Eigenschaften (features).
    Das Produkt 'Hose' hat beispielsweise gar keine Eigenschaft.
    Ein Produkt(3,'Schuh') hat zwei verschiedenen Eigenschaften ('Farbe').

    Nun möchte ich alle Produkte ausgeben, welche die Eigenschaft 'Farbe' NICHT haben.
    Es sollte mir also folgende Produkte ausgeben:
    4: Sofa
    5: Hose

    Wie bewerkstellige ich das?
    Ist das nur mit einem Subselect möglich?

  • #2
    Diese Abfrage gibt mir genau das Gegenteil aus:
    Code:
    SELECT *
    FROM `products` LEFT JOIN `prod2feat`
    ON `products`.`id` = `prod2feat`.`prod_id`
    LEFT JOIN `features`
    ON `prod2feat`.`feat_id` = `features`.`id`
    WHERE `features`.`feature` = 'Farbe'
    GROUP BY `products`.`id`

    Kommentar


    • #3
      Das Gegenteil bekommst du, wenn du in der WHERE-Klausel das Gegenteil abfragst

      Kommentar


      • #4
        So einfach ist das eben nicht.
        Bei der obigen Abfrage erhalte ich die ID's 1, 2 und 3.
        Wenn ich bei WHERE das = durch ein != ersetze, erhalte ich die ID's 2 und 4.

        Haben müsste ich aber ID 4 und 5.

        Kommentar


        • #5
          Zitat von hagu81 Beitrag anzeigen

          Nun möchte ich alle Produkte ausgeben, welche die Eigenschaft 'Farbe' NICHT haben.
          Es sollte mir also folgende Produkte ausgeben:
          4: Sofa
          5: Hose

          Wie bewerkstellige ich das?
          Ist das nur mit einem Subselect möglich?
          Code:
          test=*# select * from products where id not in (select prod_id from prod2feat where feat_id in ( select id from features where feature = 'Farbe'));
           id | name
          ----+------
            4 | Sofa
            5 | Hose
          (2 rows)
          Andreas

          Kommentar


          • #6
            Deine Schwierigkeiten enstehen durch den Tabellenentwurf
            Code:
            INSERT INTO `features` (`id`, `feature`, `value`) VALUES
            (1, 'Farbe', 'Rot'),
            (2, 'Farbe', 'Grau'),
            (3, 'Material', 'Leder'),
            (4, 'Breite', '210cm'),
            (5, 'Farbe', 'Blau');
            Das Feature "Farbe" hat 3 verschiedenen Ids. Das müßte anders aufgeteilt sein:
            Feature und "Ausprägung des Features" (ein besserer Begriff fällt mir grad nicht ein) sind 2 Paar Schuhe.

            Edit:
            Andreas' Lösung ist gut für die falsche Struktur, aber bei einer großen Datenmenge läßt ein select im select im select durchaus Zeit für ein Tässchen Kaffee.

            Kommentar


            • #7
              Zitat von achtelpetit Beitrag anzeigen
              Deine Schwierigkeiten enstehen durch den Tabellenentwurf
              ACK.

              Zum Beispiel mit einer Tabelle, die Produkt, Feature und Wert dazu abbildet, und features nur noch Id und Name des Features beinhaltet.

              Aber danach wurde ja nicht gefragt


              Andreas

              Kommentar

              Lädt...
              X