Zum Inhalt springen

Probleme mit MySQL-Abfrage


Moonlike

Empfohlene Beiträge

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

shops.png

Marken

marken.png

Anlaesse

anlaesse.png

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

connections.png

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

<?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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

shops2.png

Marken

marken2.png

Connections

connections2.png

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:

ausgabe.png

MfG Moonlike

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 3 Wochen später...

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von streffin
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Monate später...

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...