| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

30-05-2011, 18:08
|
|
Cleo
Registrierter Benutzer
|
|
Registriert seit: May 2011
Beiträge: 7
|
|
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.Id, a.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 (Id, Id_Artikel, Merkmal_Kategorie, Merkmale) VALUES (1, 1, 1, 'Rot,Blau'), (3, 2, 1, 'Gruen'), (4, 2, 2, 'Rund,Eckig');
Danke schonmal
|

30-05-2011, 18:14
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.308
|
|
FIND_IN_SET?
Peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
|

30-05-2011, 18:21
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
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');
|

30-05-2011, 18:34
|
|
Cleo
Registrierter Benutzer
|
|
Registriert seit: May 2011
Beiträge: 7
|
|
Zitat:
Zitat von h3ll
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.
|

30-05-2011, 18:43
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
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.
Geändert von h3ll (30-05-2011 um 18:47 Uhr)
|

30-05-2011, 19:01
|
|
Cleo
Registrierter Benutzer
|
|
Registriert seit: May 2011
Beiträge: 7
|
|
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
|

30-05-2011, 19:03
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von Cleo
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.
|

30-05-2011, 19:35
|
|
Cleo
Registrierter Benutzer
|
|
Registriert seit: May 2011
Beiträge: 7
|
|
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.
|

30-05-2011, 19:43
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
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.
|

30-05-2011, 19:45
|
|
Cleo
Registrierter Benutzer
|
|
Registriert seit: May 2011
Beiträge: 7
|
|
Danke, ich probier es aus. Freu mich doch über jede Hilfe.
|

30-05-2011, 22:23
|
|
Cleo
Registrierter Benutzer
|
|
Registriert seit: May 2011
Beiträge: 7
|
|
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?
|

30-05-2011, 22:35
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Nur ne Vermutung: Du hast das DISTINCT weggelassen.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

30-05-2011, 22:45
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von Cleo
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.
|

30-05-2011, 23:02
|
|
Cleo
Registrierter Benutzer
|
|
Registriert seit: May 2011
Beiträge: 7
|
|
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;
Geändert von Cleo (30-05-2011 um 23:05 Uhr)
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|