Karim's Blog

Un peu de tout sur CSS, HTML, AngularJS, JavaScript, Php et le reste

Les Sous-requêtes

Il y a plusieurs façons d’utiliser les sous-requêtes. De cette façon il y a plusieurs syntaxes envisageables pour utiliser des requêtes dans des requêtes.

Requête imbriquée qui retourne un seul résultat

L’exemple ci-dessous est une exemple typique d’une sous-requête qui retourne un seul résultat à la requête principale.

> SELECT *
FROM `table`
WHERE `nom_colonne` = (
FROM `table2`
LIMIT 1
)

Cet exemple montre une requête interne (celle sur « table2″) qui renvoi une seule valeur. La requête externe quant à elle, va chercher les résultat de « table » et filtre les résultats à partir de la valeur retournée par la requête interne.

A noter : il est possible d’utiliser n’importe quel opérateur d’égalité tel que =, >, <, >=, <= ou <>.

Requête imbriquée qui retourne une colonne

Une requête imbriquée peut également retournée une colonne entière. Dès lors, la requête externe peut utiliser la commande IN pour filtrer les lignes qui possèdent une des valeurs retournées par la requête interne. L’exemple ci-dessous met en évidence un tel cas de figure:

> SELECT *
FROM `table`
WHERE `nom_colonne` IN (
SELECT `colonne`
WHERE `cle_etrangere` = 36
)

Exemple

La suite de cet article présente des exemples concrets utilisant les sous-requêtes.

Imaginons un site web qui permet de poser des questions et d’y répondre. Un tel site possède une base de données avec une table pour les questions et une autre pour les réponses.

Table « question » :

q_id q_date_ajout q_titre q_contenu
1 2013-03-24 12:54:32 Comment réparer un ordinateur? Bonjour, j'ai mon ordinateur de cassé, comment puis-je procéder pour le réparer?
2 2013-03-26 19:27:41 Comment changer un pneu? Quel est la meilleur méthode pour changer un pneu facilement ?
3 2013-04-18 20:09:56 Que faire si un appareil est cassé? Est-il préférable de réparer les appareils électriques ou d'en acheter de nouveaux?
4 2013-04-22 17:14:27 Comment faire nettoyer un clavier d'ordinateur? Bonjour, sous mon clavier d'ordinateur il y a beaucoup de poussière, comment faut-il procéder pour le nettoyer? Merci.

Table « reponse » :

r_id r_fk_question_id r_date_ajout r_contenu
1 1 2013-03-27 07:44:32 Bonjour. Pouvez-vous expliquer ce qui ne fonctionne pas avec votre ordinateur? Merci.
2 1 2013-03-28 19:27:11 Bonsoir, le plus simple consiste à faire appel à un professionnel pour réparer un ordinateur. Cordialement,
3 2 2013-05-09 22:10:09 Des conseils son disponible sur internet sur ce sujet.
4 3 2013-05-24 09:47:12 Bonjour. Ça dépend de vous, de votre budget et de vos préférence vis-à-vis de l'écologie. Cordialement,

Requête imbriquée qui retourne un seul résultat

Avec une telle application, il est peut-être utile de connaître la question liée à la dernière réponse ajoutée sur l’application. Cela peut être effectué via la requête SQL suivante:

> SELECT *
FROM `question`
WHERE q_id = (
    SELECT r_fk_question_id
    FROM `reponse`
ORDER BY r_date_ajout DESC
LIMIT 1
  )

Une telle requête va retourner la ligne suivante:

q_id q_date_ajout q_titre q_contenu
3 2013-04-18 20:09:56 Que faire si un appareil est cassé? Est-il préférable de réparer les appareils électriques ou d'en acheter de nouveaux?

Ce résultat démontre que la question liée à la dernière réponse sur le forum est bien trouvée à partir de ce résultat.

Requête imbriquée qui retourne une colonne

Imaginons maintenant que l’ont souhaite obtenir les questions liées à toutes les réponses comprises entre 2 dates. Ces questions peuvent être récupérée par la requête SQL suivante:

> SELECT *
FROM `question`
WHERE q_id IN (
    SELECT r_fk_question_id
    FROM `reponse`
    WHERE r_date_ajout BETWEEN '2013-01-01' AND '2013-12-31'
  )

Dans notre cas, cette requête retournera les résultats suivants :

q_id q_date_ajout q_titre q_contenu
1 2013-03-24 12:54:32 Comment réparer un ordinateur? Bonjour, j'ai mon ordinateur de cassé, comment puis-je procéder pour le réparer?
2 2013-03-26 19:27:41 Comment changer un pneu? Quel est la meilleur méthode pour changer un pneu facilement ?
3 2013-04-18 20:09:56 Que faire si un appareil est cassé? Est-il préférable de réparer les appareils électriques ou d'en acheter de nouveaux?

Une telle requête permet donc de récupérer les questions qui ont eu des réponses entre 2 dates. C’est pratique dans notre cas pour éviter d’obtenir des réponses qui n’ont pas eu de réponses du tout ou pas de nouvelles réponses depuis longtemps.