2010-09-02 6 views
1

J'ai 3 tables du sujet, étudiant et relation
Les éléments suivants sont des exemples de donnéesPHP Mysql joinget résultats

 
students table 
id name 
1  John 
2  Doe 
3  Jane 

subject table 
id subject 
1  Math 
2  Science 
3  English 

relation table 
id student_id subject_id 
1  1    1 
2  1    3 
3  2    1 
4  1    2 

dans ce cas sudent avec id = 1 a 3 sujets. Comment puis-je obtenir un résultat comme celui-ci?

 
student name is John 
subjects are: 
Math 
Science 
English 

Je reçois déjà les valeurs pour l'étudiant, ce que j'essaye de faire est de montrer son sujet à l'utilisateur. Je suis totalement confus en utilisant des tables de jointure. Je suis un débutant en PHP et je commence à apprendre la semaine dernière. Je reçois une erreur sur mon code. S'il vous plaît aider.
Mon code cuurent est la suivante:

 
<?php 
//mysql connection 

$query = " 
    SELECT *,* FROM relation, subject 
    on subject_id = id 
    WHERE student_id = $student_id 
"; 
$result = mysql_query($query); 
?> 
Student name is <?php echo $name ?><br /> 
Subjects are:<br /> 
<?php 
while($row = mysql_fetch_array($result)) { 
    echo $row["subject"]; 
} 
?> 

Répondre

0

La façon simple de le faire, est d'interroger tous les étudiants:

SELECT * FROM `students`; 

puis boucle ResultSet en php, maintenant pour chacune des lignes que vous doivent faire une autre requête pour obtenir des sujets étudiants:

SELECT * FROM `subject` WHERE `id` IN (SELECT subject_id FROM relation WHERE student_id={$student_row['id']}) 

en supposant $student_row est le nom que vous choisissez pour l'attribution enregistrement tiré par les cheveux.

Maintenant, vous faites une boucle imbriquée pour aller chercher cette requête et imprimer les sujets des étudiants.

+0

Pourquoi s'embêter avec deux requêtes? C'est exactement le type de construction de données que SQL est conçu pour gérer via JOINs. –

+0

@Marc, il dit qu'il est nouveau à ce sujet, donc j'ai pensé à donner une implémentation simple, notez que cela commence par * La façon simple de le faire, c'est * – aularon

2

Commencez par vous assurer que votre requête est correcte. Je pense que c'est ce que vous cherchez:

SELECT subjects.* 
FROM subjects, 
INNER JOIN relations ON relations.subject_id = subjects.id 
WHERE relations.student_id = $student_id 

Il pourrait payer pour le vérifier dans un premier client MySQL (par exemple, phpMyAdmin). Vous remarquerez dans la partie SELECT que je n'ai que des sujets. * Parce que c'est tout ce dont vous avez besoin.

1

En fait, je demande une question d'entrevue pour éliminer les gens qui n'ont pas de connaissances SQL de base, mais prétendre sur leur CV que c'est une mise en œuvre directe de. Cela peut mener à une bonne conversation sur la conception de la base de données, la normalisation, la dénormalisation, etc.

Ce que je voudrais voir est la syntaxe de jointure de base qui va de pair avec la table de relation que vous avez créée.

"Sélectionnez le sujet des relations de jointure interne des sujets sur relations.subject_id = sujets.id où relations.student_id =?".

Prenant l'étape suivante vous arrivez à

"Sélectionner l'objet de sujets INNER JOIN relations sur relations.subject_id = subjects.id jointure des étudiants sur relations.student_id = students.student_id où students.name =?" .

vous permettant d'effectuer une requête sans pré-extraction de l'ID étudiant si vous ne souhaitez pas exposer vos clés de base de données internes à l'utilisateur externe.

Le point d'interrogation est pour la liaison de variable, il est rare que c'est une pratique raisonnable de ne pas échapper les entrées pour les interactions de base de données. La liaison variable pour les requêtes est un moyen facile d'obtenir une bonne couverture sur ce problème.J'adore poser ce problème de conception en tant que question d'entrevue car cela peut rapidement mener à des discussions sur l'injection SQL, la désinfection des formulaires Web et les meilleures pratiques générales en gestion de données, développement d'applications Web et conception de bases de données.

1

Il y a la fonction globale GROUP_CONCAT() de cette situation:

SELECT students.id, students.name, GROUP_CONCAT(subject.subject) AS subjects 
FROM students 
LEFT JOIN relation ON students.id = relation.student_id 
LEFT JOIN subject ON relation.subject_id = subject.id 
GROUP BY students.id 
ORDER BY students.name 

qui renvoie des données comme ceci:

+-------------+---------------+------------------------+ 
| students.id | students.name | subject.name   | 
+-------------+---------------+------------------------+ 
| 1   | John   | Math, English, Science | 
| 2   | Doe   | Math     | 
| 3   | Jane   | NULL     | 
+-------------+---------------+------------------------+ 

Vous pouvez le faire sans le groupement, auquel cas vous aurez un ligne pour chaque id/nom de l'étudiant/nom du sujet, et ensuite vous pouvez utiliser une machine à état simple comme dans la réponse de OMG Ponies pour la partie d'affichage.

1
<?php 
//mysql connection 
function query($query){ 
global $conn; 
$qu=mysqli_query($conn,$query); 
return $qu; 
} 

$query1 =query(" 
    SELECT * FROM student 
    WHERE student_id = $student_id 
"); 
$query2=query("SELECT * FROM relation, subject 
    WHERE relation.student_id = $student_id 
    AND subject.id=relation.subject_id 
"); 
$name=mysqli_fetch_assoc($query1); 
?> 
Student name is <?=$name['name']?><br /> 
Subjects are:<br /> 
<?php 
while($row = mysql_fetch_array($query2)) { 
    $rew[]=$row['subject'];//For store subject 
    echo $row["subject"]; 
} 
    $subject=join(",",$rew);//Get the stored subject from array 
?> 

Peut-être pouvez-vous aider?

Questions connexes