2013-02-08 2 views
2

Mon schéma est le suivant: http://acookson.org/wp-content/uploads/bookings.pngInterroger une table de lien en utilisant MySQL rejoint dans

enter image description here

Je suis en train de tirer des enregistrements uniques avec des jointures. Say 'bob' a fait une réservation le '2013-02-05 13:50:01' avec un booking.id = 6. Comment interroger, joindre et rechercher un enregistrement unique dans la table de cours?

Mes tables sont avec des données:

mysql> SELECT * from user; 
+----+--------+-----------------+ 
| id | name | email   | 
+----+--------+-----------------+ 
| 1 | bob | [email protected] | 
| 3 | sarah | [email protected] | 
| 4 | phil | [email protected] | 
| 5 | freda | [email protected] | 
| 6 | Sash | [email protected]  | 
| 7 | Glen | [email protected] | 
| 8 | Walter | [email protected] | 
+----+--------+-----------------+ 
7 rows in set (0.00 sec) 

mysql> SELECT * from booking; 
+----+---------------------+---------+ 
| id | date    | user_id | 
+----+---------------------+---------+ 
| 1 | 2013-02-08 12:28:24 |  1 | 
| 4 | 2013-02-07 12:42:02 |  3 | 
| 5 | 2013-02-05 12:42:46 |  4 | 
| 6 | 2013-02-05 13:50:01 |  1 | 
| 7 | 2013-02-01 13:50:01 |  3 | 
| 8 | 2013-02-06 13:50:01 |  3 | 
| 9 | 2013-01-29 13:50:01 |  4 | 
+----+---------------------+---------+ 
7 rows in set (0.00 sec) 

mysql> select * from lesson; 
+----+-----------------------------+---------------------+---------------------+ 
| id | name      | start_time   | end_time   | 
+----+-----------------------------+---------------------+---------------------+ 
| 2 | CBT course     | 2013-02-08 12:35:36 | 2013-02-08 13:35:36 | 
| 3 | CBT course     | 2013-02-15 11:59:44 | 2013-02-15 12:59:44 | 
| 4 | Advanced Motorcyling module | 2013-02-15 12:04:29 | 2013-02-15 13:04:29 | 
| 5 | CBT course     | 2013-02-15 12:14:27 | 2013-02-15 13:14:27 | 
| 6 | ABC course     | 2013-02-13 13:28:13 | 2013-02-13 14:28:13 | 
| 7 | LKU course     | 2013-02-11 13:28:13 | 2013-02-11 14:28:13 | 
| 8 | ERT starter course   | 2013-02-10 13:28:13 | 2013-02-10 14:28:13 | 
+----+-----------------------------+---------------------+---------------------+ 
7 rows in set (0.00 sec) 

Ma table

lesson_booking
est définie pour réduire la redondance et il est cette table qui je suis en train d'interroger (indirectement) pour obtenir des résultats.

Ma requête ressemble:

SELECT * from user as u 
JOIN booking AS b ON b.id = u.id 
JOIN lesson_booking AS lb ON b.id = lb.booking_id 
JOIN lesson AS l ON lb.lesson_id = l.id 
WHERE u.name = 'bob'; 
Empty set (0.00 sec) 

mais cela renvoie aucun résultat. Je suis assez basique avec MySQL et je cherchais donc des exemples de comment je pourrais vraiment interroger ce schéma.

Si vous pouviez me fournir plusieurs exemples (trois feraient - différents) comment je pourrais interroger cet ensemble de données alors ce serait une éducation - j'espère!

Répondre

1

Vous étiez proche - regardez votre inscription lors de la réservation - utilisez user_id au lieu de id. Il ne doit pas être b.id = u.id (ce joint à votre userid à votre bookingid), mais plutôt b.user_id = u.id:

SELECT * 
FROM user as u 
    JOIN booking AS b ON b.user_id = u.id 
    JOIN lesson_booking AS lb ON b.id = lb.booking_id 
    JOIN lesson AS l ON lb.lesson_id = l.id 
WHERE u.name = 'bob'; 

Bonne chance.

+0

Merci de m'avoir signalé cela bien que lors de l'utilisation de la requête ci-dessus je reçois toujours: Empty set (0.00 sec) – cookie

+0

Mon tableau de réservation de leçon ne devrait-il pas recevoir des tuples uniques ou 'réservations de cours' basées sur ma requête? – cookie

2

le problème avec votre requête actuelle est que vous rejoignez le ID de l'utilisateur de ID de réservation qui est faux. Il devrait être, ID de l'utilisateur à partir user_ID de la réservation:

SELECT a.*, b.*, c.*, d.* 
FROM booking a 
     INNER JOIN user b 
      ON a.user_ID = b.id 
     INNER JOIN lesson_booking c 
      ON a.id = c.booking_ID 
     INNER JOIN lesson d 
      ON c.lesson_ID = d.ID 
WHERE b.name = 'bob' 

Pour avoir pleinement connaissance sur les jointures, veuillez consulter le lien ci-dessous:

+0

Votre question ci-dessus n'est pas correcte - vous joignez la réservation deux fois ... J'ai déjà répondu à cette question - pourquoi répondre avec la même réponse :) – sgeddes

0

Vous pouvez également quelque chose comme

select * from table1 a, table2 b 
where a.id = b.id 

De cette façon, vous pouvez lier toutes les tables qui ont des relations