INNER JOIN - Problem - Hilfe

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

  • INNER JOIN - Problem - Hilfe

    Hi Ihr!

    Ich habe folgendes Problem:

    Ich habe ein Tabelle mit Produkten und eine Tabelle mit do genannten "Merkmalen", wie z.B. Farbe oder Form.

    Beim AUfruf der Seite und der MySQL-Abfrage der Artikel soll noch grprüft werden, ob der jeweilige Artikel auch zu den angeforderten Eigenschaften passt (GET-Aufruf).

    Mein problem ist, dass es mehrere Eigenschaften-Kategorien gibt, die dann die eigentlichen Eigenschaften enthalten.

    Meine gekürzte Abfrage:
    PHP-Code:
    SELECT a.Ida.Titel_1
    FROM 
        shop_produkte 
    AS a
        
    shop_merkmale_produkte AS c
    WHERE 
        c
    .Merkmal_Kategorie a.Id
    AND (
        
    c.Merkmale LIKE '%Eckig%'
        
    AND
           
    c.Merkmale LIKE '%Gruen%'
    );

    LIMIT 0 30 
    Ich bekomme jetzt kein Ergebniss geliefert, obwohl 1 Ergebnis zurückgeliefert werden müsste. Ich stehe auf dem Schlauch...

    Der Inhalt der Tabelle Merkmale:
    PHP-Code:
    INSERT INTO shop_merkmale_produkte (IdId_ArtikelMerkmal_KategorieMerkmaleVALUES
    (111'Rot,Blau'),
    (
    321'Gruen'),
    (
    422'Rund,Eckig'); 
    Danke schonmal

  • #2
    FIND_IN_SET?

    Peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Falsches Datenbankdesign. Pro Spalte darf nur ein Wert stehen, du hast aber in einer Spalte mehrere Werte mit Komma getrennt.

      Mal davon abgesehen seh ich hier keinen INNER JOIN, sondern einen scheußlichen Theta-Style Join.

      Korrekt müssten die Daten so aussehen:
      Code:
      INSERT INTO shop_merkmale_produkte
          (Id_Artikel, Merkmal_Kategorie, Merkmal)
      VALUES
          (1, 1, 'Rot'),
          (1, 1, 'Blau'),
          (2, 1, 'Gruen'),
          (2, 2, 'Rund'),
          (2, 2, 'Eckig');

      Kommentar


      • #4
        Zitat von h3ll Beitrag anzeigen
        Falsches Datenbankdesign. Pro Spalte darf nur ein Wert stehen, du hast aber in einer Spalte mehrere Werte mit Komma getrennt.

        Mal davon abgesehen seh ich hier keinen INNER JOIN, sondern einen scheußlichen Theta-Style Join.

        Korrekt müssten die Daten so aussehen:
        Code:
        INSERT INTO shop_merkmale_produkte
            (Id_Artikel, Merkmal_Kategorie, Merkmal)
        VALUES
            (1, 1, 'Rot'),
            (1, 1, 'Blau'),
            (2, 1, 'Gruen'),
            (2, 2, 'Rund'),
            (2, 2, 'Eckig');
        Danke, aber mit LIKE lässt dich doch alles finden, normalerweise.

        Kommentar


        • #5
          LIKE ist auch deutlich aufwändiger für die Datenbank, weil hier jedesmal die komplette Tabelle durchsucht werden muss, und sorgt auch für diverse andere Problemchen. Und es ändert nichts an der Tatsache, dass die Daten so falsch gespeichert sind.

          Mal ein kleines Beispiel:

          Code:
          INSERT INTO shop_merkmale_produkte
              (Id_Artikel, Merkmal_Kategorie, Merkmale)
          VALUES
              (1, 1, 'Gruen,Blau'),
              (2, 1, 'Hellgruen');
          Hier würdest du mit %Gruen% sowohl Gruen, als auch Hellgruen finden, obwohl das eventuell gar nicht gewollt ist.
          Zuletzt geändert von h3ll; 30.05.2011, 18:47.

          Kommentar


          • #6
            Das weiß ich wohl, was mit LIKE vorsich geht. Ich möchte mich auch nicht beschweren, dass geantwortet wird, nur leider bezieht es sich jetzt nicht mehr auf meine Frage

            Kommentar


            • #7
              Zitat von Cleo Beitrag anzeigen
              Ich möchte mich auch nicht beschweren, dass geantwortet wird, nur leider bezieht es sich jetzt nicht mehr auf meine Frage
              Schon schlimm. Man fährt in die Werkstatt, weil das Autoradio spinnt, und diese blöden Mechaniker wollen doch wirklich die Bremsanlage tauschen, weil sie schon halb am durchrosten ist. Die sollen gefälligst nur das machen, was ich verlange.

              Kommentar


              • #8
                Wie in fast allen Foren es üblich ist, fühlt man sich gleich wieder auf den Schlips getreten...
                Wenn man schon antwortet frage ich mich, wieso man sich darüber äußern muss, wie scheußlich etwas geschrieben ist und sich nicht der Problematik annimmt. Man sollte sich doch in meine Lage versetzen: Was bringt es mir zu wissen, dass man die Abfrage schöner, schneller etc. machen könnte? Das weiß ich auch, aber vielleicht kann ich es nicht besser?
                So, fertig gemotzt.
                Niemand wird gezwungen, konstruktiv zu helfen.

                Kommentar


                • #9
                  Tja, die Sache ist: Würdest du die Datenbank ordentlich strukturieren, gäbe es oben genanntes Problem erst gar nicht. Dann würde die Abfrage wie folgt lauten:

                  Code:
                  SELECT DISTINCT
                      p.id, p.titel
                  FROM 
                      shop_produkt AS p
                  INNER JOIN
                      shop_produkt_merkmal AS m ON ( m.produkt_id = p.id )
                  WHERE
                      m.merkmal IN ('Eckig', 'Gruen')
                  Aber wenn du den komplizierten Weg gehen will, dann geh in halt. Aber ich tu mir das sicher nicht an, also wirst du dafür zumindest auf meine Hilfe verzichten müssen.

                  Kommentar


                  • #10
                    Danke, ich probier es aus. Freu mich doch über jede Hilfe.

                    Kommentar


                    • #11
                      Hallo h3ll,
                      folgender Befehl funktioniert:
                      Code:
                      SELECT 
                          a.Id,
                          a.Titel_1,
                          c.Merkmale 
                      FROM 
                          shop_produkte as a
                          INNER JOIN shop_merkmale_produkte AS c ON (c.Id_Artikel = a.Id),
                          shop_kategorie as b 
                          
                      WHERE 
                          c.Merkmale IN ('Rot','Eckig') LIMIT 0,100;
                      , liefert jedoch leider 4 Ergebnisse (2 x mit Rot und 2 x mit Eckig).
                      Ich möchte jedoch, dass nur Produkte gefunden werden, die alle Merkmale aufweisen... Wie kommt es, dass ich die Ergebnisse doppelt erhalte?

                      Kommentar


                      • #12
                        Nur ne Vermutung: Du hast das DISTINCT weggelassen.
                        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                        Super, danke!
                        [/COLOR]

                        Kommentar


                        • #13
                          Zitat von Cleo Beitrag anzeigen
                          Ich möchte jedoch, dass nur Produkte gefunden werden, die alle Merkmale aufweisen...
                          Code:
                          GROUP BY
                              a.Id
                          HAVING
                              COUNT(DISTINCT c.Id) = 2
                          Dein Code ist übrigens ein ziemlicher durcheinander. Warum hast du shop_kategorie noch hinten dran gehängt? Dadurch erzeugst du ein Kreuzprodukt. Außerdem sind Theta-Style Joins böse. Mach bitte nur sauber Joins.

                          Außerdem könntest du deine Alias-Namen etwas sinnvoller wählen. a, b, c sagt genau nichts aus. Schau doch mal, wie ich das bei meine Beispiel gemacht habe.

                          Kommentar


                          • #14
                            Wow Danke! Hat funktioniert. Was das mit der 2 ist, habe ich auch geschnallt. Ist ja toll, was man machen kann, wenn man weiß wie .
                            Die Kategorie brauche ich noch für andere Dinge...
                            Code:
                            SELECT 
                                DISTINCT(a.Id),
                                a.Titel_1,
                                c.Merkmale 
                            FROM 
                                shop_produkte as a
                                INNER JOIN shop_merkmale_produkte AS c ON (c.Id_Artikel = a.Id)
                                INNER JOIN shop_kategorie as b ON (b.id = a.Kategorie)
                                
                            WHERE 
                                c.Merkmale IN ('Blau','Eckig','Rot') 
                            GROUP BY
                                a.Id  
                            HAVING
                                COUNT(DISTINCT c.Merkmale) = 3;
                            Zuletzt geändert von Cleo; 30.05.2011, 23:05.

                            Kommentar

                            Lädt...
                            X