Probleme mit MySQL-Abfrage

Moonlike

Grünschnabel
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.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
 
Hi,

also du willst alle Shops, in denen es was von Adidas gibt? Dann brauchst du zunächst mal einen JOIN und eine WHERE:

Code:
SELECT * FROM shops s
INNER JOIN connections c ON c.Shop_ID = s.ID
INNER JOIN marken m ON c.Marke_ID = m.ID
WHERE m.Markenname = 'Adidas';

Ungetestet.
 
Hi,

also du willst alle Shops, in denen es was von Adidas gibt? Dann brauchst du zunächst mal einen JOIN und eine WHERE:

Code:
SELECT * FROM shops s
INNER JOIN connections c ON c.Shop_ID = s.ID
INNER JOIN marken m ON c.Marke_ID = m.ID
WHERE m.Markenname = 'Adidas';

Ungetestet.

Vielen Dank erstmal für die Antwort,

ich habe mir zu "JOIN" mal ein paar Beispiele angeschaut, jedoch arbeiten diese jeweils mit zwei Tabellen, ähnlich wie in deinem Beispiel, inwiefern ich das aber auf 4 Tabellen umändern muss, ist mir leider nicht schlüssig.

Hier mal mein jetziger Code, evtl. bringt der etwas.
Code:
<?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>

MfG Moonlike
 
Joins verbinden Tabellen, meistens über einen Fremdschlüssel oder zu mindest etwas, was in diesen Tabellen gleich ist. Ich weiß nicht, wie ich das besser erklären kann, als man es in wikipedia oder bei little-idiot.de nachlesen kann.
 
Joins verbinden Tabellen, meistens über einen Fremdschlüssel oder zu mindest etwas, was in diesen Tabellen gleich ist. Ich weiß nicht, wie ich das besser erklären kann, als man es in wikipedia oder bei little-idiot.de nachlesen kann.

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:
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
 
SQL:
SELECT  shops.ID, shops.Name, shops.Ort, marken.Markenname FROM shops, marken WHERE shops.id=connections.shop_id and connections.Marke_ID = marken.ID and marken.markenname="Adidas" order by shops.id

funktioniert nicht?
 
Zuletzt bearbeitet von einem Moderator:
Bekomme dadurch die selbe Ausgabe.
Nun stellt sich aber für mich die Frage, ob sich die Unterschiede zwischen deiner Methode und der Join Methode erst später bemerkbar machen, oder ob es einfach mit beiden Methoden lösbar ist.
 
Es sind beide Varianten von JOINs. Es gibt diverse Arten von JOINs. Zvoni hat einen sog. Equi-Join erstellt. Du hast einen Inner-Join erstellt. Mit Hilfe von "EXPLAIN SELECT .... " kannst du die Unterschiede sehen.

Hier ein Select, der funktionieren dürfte:

Code:
SELECT s.Name, s.Ort, m.Markenname, c.ID AS Connection_ID, s.ID AS Shop_ID, m.ID AS Marke_ID
FROM `shops` s
INNER JOIN `connections` c ON c.Shop_ID = s.ID
INNER JOIN `marken` m ON c.Marke_ID = m.ID
WHERE m.Markenname = 'Adidas'
 

Neue Beiträge

Zurück