2016-12-23 4 views
1

Ich versuche, meinen Kopf rund um die Normalisierung Tabellen zu wickeln, den Code, den ich unten zusammengestellt habe, ist für Demozwecke und ist keine Produktion. Ich habe zwei Tabellen erstellt, eine users Tabelle und eine eye_color Tabelle, so dass ich eine Eins-zu-viele-Beziehung zwischen zwei haben kann.Lerntabelle Joins in PHP mysqli

Was ich tun möchte ist, den Benutzer und ihre Augenfarbe mit Namen zu zeigen, aber sogar versuchen, ein Ergebnis zurückzugeben ist schwierig für mich und ich frage mich, wo ich falsch liege habe ich gesucht und gesucht, aber ich lerne besser aus Diskussion:

$sql = "SELECT * 
     FROM users 
     INNER JOIN eye_color 
     ON user.eye_color = eye_color.id"; 

$result = mysqli_query($conn, $sql); 


if (mysqli_num_rows($result) > 0) { 
    while($row = mysqli_fetch_assoc($result)) { 
     echo $row['id']; 
     echo $row['eye_color']; 
    } 
} else{ 
    echo 'No results'; 
} 

ich bin nicht für ein völliges Antwort mich auf der Suche nach Rat suchen, damit ich vorwärts bewegen und mein Verständnis fortzusetzen.

Meine Tabellenstruktur ist wie folgt aus:

Table name: users 
id (PK) 
name 
email (Unique) 
eye colour (FK) 

Table name: eye_color 
id (PK) 
color 
+0

Möglicherweise möchten Sie eine linke Verbindung statt einer inneren Verbindung. [Dies ist eine gute Erklärung der verschiedenen Arten von Joins] (https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/) – aynber

+0

Wird es viele mögliche Augenfarben für einen Benutzer geben? wenn ja links beitreten brauchen Sie –

+0

@PeterDarmis Nun, jeder Benutzer wird in diesem Beispiel eine einzige Augenfarbe gegeben werden – danjbh

Antwort

3

Sie einen Syntaxfehler haben. Und fügen Sie Ihren Abfragen zusätzlich Back-Ticks hinzu. user ist ein reservierter MySQL keyword.

$sql = "SELECT `users`.`name`,`eye_color`.`color` 
     FROM `users` 
     INNER JOIN `eye_color` 
     ON `users`.`eye_color` = `eye_color`.`id`"; // not `user`.`eye_color` 

$result = mysqli_query($conn, $sql); 


if (mysqli_num_rows($result) > 0) { 
    while($row = mysqli_fetch_assoc($result)) { 
     echo $row['name']; 
     echo $row['color']; 
    } 
} else{ 
    echo 'No results'; 
} 
+0

Oh wow, also habe ich wirklich verstanden, was ich erreichen wollte, vielen Dank, dass du das gesehen hast! – danjbh

+0

Also, mit einem Join wie diesem, ist es möglich, die Zeichenfolge/varchar der Augenfarbe auszugeben, indem Sie die Zeile eye_color aushecken? – danjbh

+0

Jetzt können Sie @danjbh nur die Daten holen, die Sie wirklich brauchen, aus der Datenbank, die Benutzername und Farbe sind, wenn Sie E-Mails benötigen, um auch das zu holen ... warum alle '*'? –

2

Ihre Abfrage scheint ok, da users.eye_color Referenzen eye_color.id. Das Problem, das ich in Ihrem Code sehe, ist, dass Sie versuchen, $row['eye_color'] zu verwenden, um den Namen der Farbe anzuzeigen, während das die ID der eye_color wäre. Sie sollten $row['color'] verwenden.

Im Allgemeinen, um solche Probleme zu debuggen, könnten Sie eine var_dump($row) tun, so dass Sie genau sehen können, welche Schlüssel/Werte das Ergebnis enthält.

// ... 
if (mysqli_num_rows($result) > 0) { 
    while($row = mysqli_fetch_assoc($result)) { 
     var_dump($row); 
     //... 
    } 
} else { 
    echo 'No results'; 
} 
+0

Vielen Dank für Ihren Beitrag, der so viel mehr Sinn macht. – danjbh