[mysql] Hilfe bei komplizierter MySQL Abfrage

Tarta

Grünschnabel
Hallo!

Ich entwickle grade ein etwas komplexeres Programm und bin dabei bei einer MySQL-Abfrage auf ein Problem gestossen, welches ich nicht alleine gelöst bekomme. Vielleicht kann mir jemand von Euch helfen!

3 Tabellen (Sind eigentlich komplexer aber ich beschränke mal auf die benötigten Werte)

t_maschinen t1
maschinen_id
maschinen_name

t_features t2
feature_id
lang
feature_name

t_zuordnung t3
zuordnung_id
feature_id
maschinen_id

Folgende Bedingungen sollen erfüllt werden.
Die 3 Tabellen werden miteinander verknüpft wobei
t2.feature_id = t3.feature_id und t3.maschinen_id = t1.maschinen_id sein soll.

Weiterhin gibt es Werte (feature_id's) die vom Programm übergeben werden.
Hier kann der User auswählen, welche Features er unbedingt haben möchte, d.h. alle Features müssen auf die Maschine zutreffen.

Wie erstelle ich nun die Abfrage, die mir als Ergebnis genau die Maschinen liefert, die die gewünschten Features enthalten?
Mein Problem liegt darin, dass die Features einer Maschine in mehreren Zeilen der Tabelle t3 vorliegen.

Ich habe bereits einmal gesehen, dass eine solche Verknüpfung möglich ist, schaffe mit meinen MySQL-Kenntnissen nur leider keine Reproduktion.

Wenn ich mich irgendwo umständlich oder unverständlich ausgedrückt habe ergänze ich den Text auf Hinweise hin gerne noch.
Über eine Lösung für das Problem wäre ich sehr dankbar!

Vielen Dank für Eure Bemühungen im Voraus.

Stefan
 
Lösungsversuch

Hi es geht wohl in die Richtung:

PHP:
SELECT a.maschinen_name,  b.feature_name, c.zuardnung_id FROM t3 AS c 
LEFT JOIN t1 AS a USING(maschinen_id) RIGHT JOIN t2 as b USING(feature_id)
WHERE zuordnung_id = ".$zuordnung_id."

gibt dir aus:

maschinen name von t1
feature name von t2

in abhängigkeit der zuordnungs id von t3

oder willst das doch anderst?

mfG Sebastian
 
Hi Sebastian, leider funktioniert das ganze so noch nicht und ich glaube das Prinzip ist auch noch nicht ganz klar geworden.

Die Maschine wird in t1 definiert
Die Features sind in t2 definiert

und t3 betreibt die Zuordnung zwischen t1 und t2.

In t3 können mehrere features (jeweils in einer eigenen zeile) einer maschine zugeordnet sein.

Es sollen aber nur Maschinen ausgegeben werden, die mehrere dieser features besitzen (and) und nicht (or).

Darin liegt das Problem - Es müsste eine Abfrage sein, die alle Tabellenzeilen vergleicht die zu einer Maschine in t3 zugeordnet sind und überprüft ob diese zeilen die gesuchten werte enthalten.

Nur wenn das der Fall ist soll die Maschine gezeigt werden, nicht aber wenn nur eins oder nicht alle der bedingungen zutreffen.
 
also muss ich nochmal genauer drauf eingehen:

was in welcher tabelle ist, ist soweit klar.

zur funktion:

der kunde übergibt die feature_id in form eines Arrays (richtig?):
- $feature_id ['0'] = ' x ',
- $feature_id ['1'] = ' y ',
- $feature_id ['2'] = ' z '

nun soll anhand der feature_id[ ] überprüft werden, welche maschine genau diese feature (und nicht weniger) beinhaltet... ist das soweit richtig?

ist etwas komplexer ja...
soll ich dir was mit PHP schreiben? oder was verwendest Du?
 
Ich schreibs in PHP und das mit dem Array ist richtig.
Ich benötige eigentlich nur die MySQL Abfrage, da ich die eh später dynamisch erstellen werde - kommt halt noch einiges dazu. Das ganze ist im Rahmen einer 'Profisuche' .
 
geht meiner meinung nach nicht in einer einzelnen Abfrage...
@all und wenn, verbessert mich bitte ;)

ich kann dir nur eine schnelle Lösung geben.. geht sicher auch besser...
hab aber nur wenig Zeit... wenn es Dir sehr wichtig ist, meld Dich einfach nochmal

PHP:
<?PHP
####################################
# gegeben: $feature_id[]
####################################

$i = 0;
//alle Maschinen prüfen
foreach($feature_id AS $key => $value);
{
         //Abfrage aus t3
         $sql = "SELECT maschinen_id FROM t3 WHERE feature_id != '".$value."'"; //eventuel <> anstatt !=
         $result = mysql_query($sql, $db);

         while($row = mysql_fetch_row($result))
         {
                     //erzeuge Array mit allen Maschinen die ein gewähltes Feature NICHT unterstützen
                     $no_feature[$i] = $row['maschinen_id'];
                     $i++;
         }
}

//alle Maschinen ausgeben, die nicht im $no_feature Array stecken
foreach($no_feature AS $key => $value);
{
          //Abfrage aus t1
         $sql = "SELECT maschinen_name FROM t1 WHERE maschinen_id != '".$value."'"; //eventuel <> anstatt !=
         $result = mysql_query($sql, $db);

         while($row = mysql_fetch_row($result))
         {
                     //erzeuge Array mit allen Maschinen die die gewählten Features unterstützen
                     $maschinen[$i] = $row['maschinen_id'];
                     $i++;
         }
}
//alle gewollten Maschinen stecken im Array: $maschinen[]

?>
 
Zuletzt bearbeitet:
Die Idee ist schonmal grundsätzlich gut und ich bedanke mich dafür. Leider gibt es einen kapitalen Fehler:

Dadurch, dass zu jeder Maschine in der Zuordnungstablle t3 alle features aufgelistet sind die sie hat - also z.B.

1,4,6

werden z.B. bei deiner suche nach <> / != 4 die werte 1 und 6 gefunden welchen ebenfalls die gleiche maschinen_id zugeordnet ist.
Dadurch wird die ID der Maschine als nicht gültig ausgegeben was falsch ist und die Maschine aus dem rennen nimmt ....
 
Ok schwierig aber nicht unmöglich :)

$feature_id ist ja das Array mit den ID Werten

Zuerst brauchen wir die anzahl der Werte

$fid_menge = size($feature_id);

dann müssen wir ein String bauen

$fid_suche = explode("','",$feature_id); #hier kann es sein das du mit \ vor den ' arbeiten musst

dann die SQL abfrage:

select *,sum(t3.feature_id) as anzahl from t1 left join t3 on t1.maschinen_id =
t3.maschinen_id where t3.feature_id in ('$fid_suche') and anzahl = $fid_menge group by t1.maschinen_id

sollte es dann ausgeben

untestet :)
 
Zurück