Joindre 2 tables

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous,

pour un projet je me suis lancé dans le sql mais dans le cadre de ce projet j'ai besoin de faire une requête qui joint 2 tables que voici :

1
2
3
4
5
6
7
8
CREATE TABLE recipes(id INTEGER PRIMARY KEY, name TEXT);

CREATE TABLE menus(
                   id INTEGER PRIMARY KEY,   mon INTEGER,
                   tue INTEGER, wed INTEGER, thu INTEGER,
                   fri INTEGER, sat INTEGER, sun INTEGER,
                   FOREIGN KEY(mon, tue, wed, thu, fri, sat, sun)
                   REFERENCES recipes(id, id, id, id, id, id, id));

Le but est donc de remplacer les ids de recipes stockés dans menus par le nom de la recette qui y correspond.

Je ne pense pas le problème soit trop compliqué mais étant donné que j'ai appris le sql sans trop m’attarder dessus je n'ai pas réussit à trouver les mots clefs à taper dans mon moteur de recherche.

Je vous remercie d'avance pour vos réponses :)

PS : j'ai mis le sujet dans la section programmation car ce n'est pas dans le cadre dans site web que j'utilise la db, est-ce qu'un admin pourrait le changer si cela n'est pas approprié.

+0 -0

Hmm, je crois qu'il faut faire plusieurs REFERENCES du style :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE TABLE recipes(
    id INTEGER PRIMARY KEY, 
    name TEXT
);

CREATE TABLE menus(
    id INTEGER PRIMARY KEY,
    mon INTEGER,
    tue INTEGER,
    wed INTEGER,
    thu INTEGER,
    fri INTEGER,
    sat INTEGER,
    sun INTEGER,
    FOREIGN KEY(mon) REFERENCES recipes(id),
    FOREIGN KEY(tue) REFERENCES recipes(id),
    FOREIGN KEY(wed) REFERENCES recipes(id),
    FOREIGN KEY(thu) REFERENCES recipes(id),
    FOREIGN KEY(fri) REFERENCES recipes(id),
    FOREIGN KEY(sat) REFERENCES recipes(id),
    FOREIGN KEY(sun) REFERENCES recipes(id),
);

Mais ton idée à l'air bien

+0 -0

Ah ! je voulais dire :

1
2
FOREIGN KEY(mon, tue, wed, thu, fri, sat, sun)
REFERENCES recipes(id, id, id, id, id, id, id));

Je savais pas que cela pouvait s’écrire ainsi.

Pour ta requête c'est de la jointure de table, tu peut faire sa avec un/des where ou un/des inner join (qui sont plus adapté et rapide).

Suivant ce que tu recherche cela ne se tourne pas de la même façon, je crois que ça se présente comme sa en inner join :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
SELECT mo.name, tu.name, we.name, th.name, fr.name, sa.name, su.name
FROM menus m
INNER JOIN recipes mo ON mo.id = m.mon
INNER JOIN recipes tu ON tu.id = m.tue
INNER JOIN recipes we ON we.id = m.wed
INNER JOIN recipes th ON th.id = m.thu
INNER JOIN recipes fr ON fr.id = m.fri
INNER JOIN recipes sa ON sa.id = m.sat
INNER JOIN recipes su ON su.id = m.sun
WHERE m.id = ##ID_DU_MENU_SOUAITE##

et en where :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
SELECT mo.name, tu.name, we.name, th.name, fr.name, sa.name, su.name
FROM menus m, recipes mo, recipes tu, recipes we, recipes th, recipes fr, recipes sa, recipes su
WHERE mo.id = m.mon AND
WHERE tu.id = m.tue AND
WHERE we.id = m.wed AND
WHERE th.id = m.thu AND
WHERE fr.id = m.fri AND
WHERE sa.id = m.sat AND
WHERE su.id = m.sun AND
WHERE m.id = ##ID_DU_MENU_SOUAITE##
+0 -0

Si ton objectif est effectivement de faire 7 jointures sur la table recipes comme le post précédent te le suggère, c'est la structure de la table menus qui ne me paraît pas très appropriée pour cet usage.

Tu gagneras sûrement beaucoup à créer une table menus qui ressemble à ce qui suit, autant pour les performances générales que la simplicité de récupération/jointure.

1
2
3
4
5
6
create table menus (
id int primary key,
day enum('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'),
recipe_id int,
foreign key(recipe_id) references recipes(id)
);
+1 -0

Salut,

Premièrement désolé pour la réponse tardive, j'ai pas pris de temps pour coder ces derniers jours et je voulais essayer les propositions avant de répondre.

+QuentinC C'est vrai que c'est plus logique de faire ainsi malheureusement les enum ne sont pas supportées par sqlite3 (types supportés)

Du coup je vais utilisé les inner join, en fait je ne savais pas que l'on pouvais leur donner des noms et du coup je n'arrivais a en faire qu'un par requête.

Merci pour vos réponses, le sujet m'a l'air résolue mais si jamais vous trouvez un meilleur moyen de faire n'hésitez pas à vous manifester.

+0 -0

Hey, du coté des enums c'est pas très grave tu peux faire une table Jours avec un id pour le code du jour puis son nom (ça fait 7 entrée dans la table Jours) qui sera alors joint à la place du enum actuel. Ça se fait souvent ainsi d’ailleurs (enfin, j'ai un niveau DUT en informatique, je connais pas tout…).

Du coup je vais utilisé les inner join, en fait je ne savais pas que l'on pouvais leur donner des noms et du coup je n'arrivais a en faire qu'un par requête.

LudoBike

Ce sont des alias ;-)

+0 -0

+QuentinC C'est vrai que c'est plus logique de faire ainsi malheureusement les enum ne sont pas supportées par sqlite3 (

C'est pas grave, un nombre entre 1 et 7 fera très bien l'affaire. De toute façon c'est exactement ce que font les SGBDR qui supportent enum en interne.

La table bonus pour faire correspondre les nombres aux noms des jours c'est bien mais même pas obligatoire. C'est pas demain que tu vas ajouter un jour dans la semaine.

+0 -0

Faire une table avec 7 colonnes ( une pour chaque jour de la semaine), c'est galère. C'est sûr que ce n'est ps demain que tu vas ajouter un jour dans la semaine.

Mais imagine que demain, ta catine ferme le dimanche. Ou bien qu'elle ouvre midi ET soir. Avec un chiffre entre 1 et 7, ou entre 1 et 14, c'est plus simple.

De manière générale, les bases de données les données doivent être au 'kilomètre', c'est à dire une ligne par repas dans ton cas.

Imagine qu'on te demande une statistique à la fin de l'année : Combien de fois on a servi tel plat ? Ou combien de fois on a servi tel plat le jour J suivi de tel autre plat le lendemain ?

Avec une ligne par jour, c'est facile. Avec une ligne par semaine, ça fait des requêtes très longues à taper.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte