Moonlike Geschrieben 28. Mai 2012 Geschrieben 28. Mai 2012 Hallo zusammen, ich möchte zurzeit als Projekt, um meine Programmingskills zu verbessern, eine Website aufbauen, bei Welcher ich z.B. nach Adidas suche und dazu jeden Shop geliefert bekomme, welcher die Marke Adidas im Sortiment hat. Dazu habe ich eine Datenbank mit 4 Tabellen aufgebaut. Shops Marken Anlaesse Jetzt kann ein Shop ja mehrere Marken besitzen, und der Shop kann kleidung für verschiedene Anlässe besitzen, somit handelt es sich um eine n:n beziehung. Diese wollte ich mit einer weiteren Tabelle namens "Connections" auflösen. Connections Somit kann ich nun dem Shop Planet-Sports mehrere Marken und Anlässe zuweisen. Als erstes stellt sich für mich die Frage, ob es mit diesem System überhaupt lösbar ist, oder ob es da bessere Möglichkeiten gibt das zu lösen? Wenn ich dazu dann eine SQL-Abfrage erstelle, bekomme ich deutlich mehr Ergebniss, als ich eigentlich bekommen sollte. Inwiefern ich das mit WHERE eingrenzen kann, ist mir leider nicht schlüssig. Über Antworten und Tipps würde ich mich sehr freuen. MfG Moonlike Zitieren
robotto7831a Geschrieben 28. Mai 2012 Geschrieben 28. Mai 2012 Und wie schaut deine Abfrage aus? Zitieren
Moonlike Geschrieben 28. Mai 2012 Autor Geschrieben 28. Mai 2012 <?php include_once 'connect_to_mysql.php'; ?> <?php // Include database connection include_once 'connect_to_mysql.php'; // SQL query to interact with info from our database $sql = mysql_query("SELECT * FROM shops, marken, anlaesse, connections WHERE connections.Marke_ID = 2 "); $i = 0; // Establish the output variable $dyn_table = '<table border="1" cellpadding="10">'; while($row = mysql_fetch_array($sql)){ $name = $row["Name"]; $ort = $row["Ort"]; $marken = $row["Markenname"]; $anlass = $row["Anlass"]; if ($i % 3 == 0) { // if $i is divisible by our target number (in this case "3") $dyn_table .= '<tr><td>'. $name . '<br/>' . $ort . '<br/>' . $marken . '<br/>' . $anlass . '</td>'; } else { $dyn_table .= '<td>' . $name . '<br/>' . $ort . '<br/>' . $marken . '<br/>' . $anlass . '</td>'; } $i++; } $dyn_table .= '</tr></table>'; ?> <html> <body> <h3>Dynamic PHP Grid Layout From a MySQL Result Set</h3> <?php echo $dyn_table; ?> </body> </html> Die Ausgabe in diesem Tabellenformat ist gewollt, kann zu testzwecken aber gerne erstmal umgeändert werden. Funktionieren sollte es letzendlich wie folgt: Ich kann aus einer liste von Marken aussuchen, welche ich möchte, die Abfrage wird dann Automatisch anhand der Auswahl angepasst(bisher soll nur eine Auswahl auf einmal möglich sein) Sind meine Tabellen soweit korrekt? MfG Moonlike Zitieren
robotto7831a Geschrieben 29. Mai 2012 Geschrieben 29. Mai 2012 In deiner where Bedingung fehlt die Join Anweisung. So hast Du ein kartesisches Produkt. Zitieren
Moonlike Geschrieben 29. Mai 2012 Autor Geschrieben 29. Mai 2012 In deiner where Bedingung fehlt die Join Anweisung. So hast Du ein kartesisches Produkt. Habe das nun mal versucht meine Ausgabe mit JOIN anzupassen, und könnte soweit passen, über eine Kontrolle würde ich mich aber freuen. Habe zu testzwecken mal die Tabelle Anlaesse gelöscht, sodass ich erstmal eine leichtere Anfrage erstellen kann. Daher einfach nochmal meinen neuen Datenbankaufbau. Shops Marken Connections Code:<html> <body> <table width="30%" border="1"> <tr bgcolor="#CFCFCF"> <?php // Include database connection include_once 'connect_to_mysql.php'; // SQL query to interact with info from our database $sql = mysql_query("SELECT shops.ID ,shops.Name, shops.Ort, marken.Markenname FROM connections INNER JOIN shops ON connections.Shop_ID = shops.ID INNER JOIN marken ON connections.Marke_ID = marken.ID ORDER BY shops.ID ASC "); $anzahl=mysql_num_fields ($sql); for($i=0; $i<$anzahl; $i++){ ?> <th> <?php echo mysql_field_name ($sql,$i); ?> </th> <?php }?> </tr> <tr> <?php while ($zeile = mysql_fetch_array ($sql, MYSQL_ASSOC)) { foreach ($zeile as $elem) { echo"<td bgcolor='#EFEFEF'><font size=#-1'> $elem</font></td>"; } ?> </tr> <?php } ?> </table> <?php mysql_close(); ?> </body> </html> Ausgabe: MfG Moonlike Zitieren
Moonlike Geschrieben 29. Mai 2012 Autor Geschrieben 29. Mai 2012 Habe in einem anderen Forum Probleme mit MySQL-Abfrage @ tutorials.de: Tutorials, Forum & Hilfe eine weitere Methode zur lösung meines Problems erhalten: SELECT shops.ID, shops.Name, shops.Ort, marken.Markenname FROM shops, marken WHERE shops.id=connections.shop_id AND connections.Marke_ID = marken.ID ORDER BY shops.id Mit diesem Code erhalte ich die gleiche Ausgabe, jedoch stellt sich für mich nun die Frage, inwiefern ich die JOIN Methode trotzdem benützen sollte, bzw. welche Unterschiede könnten sich bemerkbar machen? Zitieren
robotto7831a Geschrieben 29. Mai 2012 Geschrieben 29. Mai 2012 Es sind nur zwei verschiedene Schreibweisen. Zitieren
mcn Geschrieben 15. Juni 2012 Geschrieben 15. Juni 2012 Hiho, bin jetzt nicht so der Könner in SQL-Abfragen. Aber, irgendwas macht mir Bauchweh. Deshalb diesen Beitrag ggf. als Frage denn als Lösung auffassen. Ist es nicht "besser" die Abfrage anstatt $sql = mysql_query("SELECT shops.ID ,shops.Name, shops.Ort, marken.Markenname FROM connections INNER JOIN shops ON connections.Shop_ID = shops.ID INNER JOIN marken ON connections.Marke_ID = marken.ID ORDER BY shops.ID ASC "); so zu gestalten: $sql = mysql_query("SELECT shops.ID ,shops.Name, shops.Ort, marken.Markenname FROM connections INNER JOIN marken ON connections.Marke_ID = marken.ID INNER JOIN shops ON connections.Shop_ID = shops.ID ORDER BY shops.ID ASC "); Meinem Verständnis nach sollte das die Ergebnismenge des ersten JOIN einschränken. Und, muss marken.ID nicht in das SELECT-statement mit rein? $sql = mysql_query("SELECT shops.ID, [COLOR="red"]marken.ID[/COLOR] ,shops.Name, shops.Ort, marken.Markenname FROM connections ... Oder kann man das weglassen, wenn man das mit JOINs macht (bei select...from...where würde das doch mit reinkommen, gell?) ? Kommt am Ende wohl selbiges Ergebnis bei raus, wenn ich nicht grad schwer irre - grad kein mySql installiert. Kann es deshalb nicht testen. Zum Datenbankdesign würde ich gern noch ein oder zwei Dinge sagen: Überleg dir doch mal, ob es nicht Sinn machen würde die Tabelle "Shops" weiter zu zerlegen. Sieht mir stark nach einer m:n - Beziehung aus. HM, bei der Tabelle connections kannst du - glaube ich - die ID weg lassen. So, und nun schlagt mich! greetz und happy we Zitieren
robotto7831a Geschrieben 16. Juni 2012 Geschrieben 16. Juni 2012 Der Teil zwischen Select und From ist nicht enscheidend für den Join. Soll heißen, dass der Join auch funktioniert wenn keine Spalte aus der gejointen Tabelle angzeigt wird. Stichwort m:n Tabellen. Wofür soll man die Zwischentabelle um die m:n Beziehung aufzulösen anzeigen. Diese Tabelle ist ja nur ein technisches Hilfsmittel. Zitieren
mcn Geschrieben 16. Juni 2012 Geschrieben 16. Juni 2012 Hiho, früh am werkeln. Gefällt mir. Habe mir also jetzt doch mal die Arbeit gemacht und xampp installiert um die DB nach zu basteln. Also, Recht hast Du. Das Feld marke.ID muss da tatsächlich nicht mit in die Liste bei Verwendung von JOINs. Allerdings: Ich würd da noch einbe GROUP BY einfügen. Sonst gibts da shops mehrfach in der Ergebnismenge. Mein Vorschlag bei Verwendung von JOINs: SELECT shops.Ort FROM connections INNER JOIN marken ON connections.MarkeID = 1 INNER JOIN shops ON connections.shopID = shops.id group by shops.ort order by shops.ort asc Und weil es eingangs ja als select... from... where formuliert war: SELECT shops.Name from shops, connections where connections.markeID = 1 && shops.ID = connections.shopID GROUP BY shops.Name ORDER BY shops.Name ASC Auswahlliste jeweils stark vereinfacht! Und die Marken-ID einfach mal fest verdrahtet. Was die m:n - Beziehung angeht: Es ging mir nicht darum hier irgendwas (in Form einer Tabelle) darzustellen. Die Frage war ob es nicht Sinn macht die Tabelle shops weiter zu zerlegen. Stichwort Redundanzen. In der Tabelle connections das Feld ID weg lassen! Weil es m.E. überflüssig ist. Wird ja (ohne das Feld ID als PK) eindeutig durch die einzelnen Datensätze. So. my 50cent. Wochenende. greetz Zitieren
streffin Geschrieben 21. Juni 2012 Geschrieben 21. Juni 2012 (bearbeitet) Hiho, bin jetzt nicht so der Könner in SQL-Abfragen. Aber, irgendwas macht mir Bauchweh. Deshalb diesen Beitrag ggf. als Frage denn als Lösung auffassen. Ist es nicht "besser" die Abfrage anstatt so zu gestalten: $sql = mysql_query("SELECT shops.ID ,shops.Name, shops.Ort, marken.Markenname FROM connections INNER JOIN marken ON connections.Marke_ID = marken.ID INNER JOIN shops ON connections.Shop_ID = shops.ID ORDER BY shops.ID ASC "); Meinem Verständnis nach sollte das die Ergebnismenge des ersten JOIN einschränken. Es ist zwar sehr schön, dass du dir darüber Gedanken machst, aber glaub mir, lass es. Ein DBMS ist seeeehr optimiert darauf, anhand von internen Statistiken die Performance von Abfragen zu optimieren. Die Join Reihenfolge gehört da dazu. Ja es ist grundsätzlich nicht nachteilhaft, und hier und da zwingend notwendig, die Datenbank Abfragen selbst zu optimieren, aber da brauchst du tiefere Kenntnisse über das entsprechende DBMS (die diversen Join typen, das lesen der erstellten Execution Pläne etc). Kurz gesagt, da musst du sehr tief in die Materie einsteigen, damit "du es besser weist" als das DBMS das dir den SQL parst. Bei MySql wüsst ich jetzt nichmal, wie rein syntaktisch eine bestimme Join Reihenfolge erzwungen werden kann, ich bin mehr der MSSQL Mensch. Gruß Sven Bearbeitet 21. Juni 2012 von streffin Zitieren
mcn Geschrieben 7. September 2012 Geschrieben 7. September 2012 Hiho, mir ist dieser post nicht aus dem Kopf gegangen. Es ist zwar sehr schön, dass du dir darüber Gedanken machst, aber glaub mir, lass es. [...] In der Vergangenheit hatte ich recht viel mit dem MBS Dynamics AX 2012 zu tun. Das ist ein ERP-System. Sehr Datenbank-lastig. Da hab ich nochmal bissl die Doku dazu recherchiert und durchforstet. So beginnend ab etwa hier: Select Statement Syntax [AX 2012] in Verbindung mit den Themen ab etwa hier: Data Selection and Manipulation [AX 2012] Ein DBMS ist seeeehr optimiert darauf, anhand von internen Statistiken die Performance von Abfragen zu optimieren. Die Join Reihenfolge gehört da dazu. Dem kann man nicht widersprechen, allerdings halte ich es durchaus für angebracht sich darüber mehr als nur Gedanken zu machen. Sprich: Es auch anzuwenden. Vllt. nicht unbedingt in einer Mini-Datenbank mit einer Anzahl Datensätzen, die ich an den Fingern von drei Mitarbeitern abzählen kann. Aber ich hatte meine Aussage diesbezüglich auch mehr grundsätzlich verstanden. Naja, happy weekend. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.