SQL : Rechercher une valeur dans plusieurs champs

emrh Messages postés 427 Date d'inscription   Statut Membre Dernière intervention   -  
 Tessel75 -

Bonjour,

Dans une table d'une base de donnée Sql, existe  t-il un moyen de retrouver une valeur qui pourrait se trouver dans plusieurs champs ?

Ma table menus_composition est composée ainsi : 

Les champs "midi_entree", "midi_plat", "soir_dessert".... stockent l'id_recette de la table"recettes" à laquelle ils sont liés par une contrainte de clé étrangère.

J'aimerai pouvoir compter l'éventuelle présence de la recette n°212 soit dans midi_entree, soit dans midi_plat, soit dans etc, etc...
Autant je sais rechercher dans un champs mais je ne sais pas comment faire dans plusieurs !

Merci d'avance pour votre aide.

Linux / Chrome 104.0.0.0

A voir également:

4 réponses

jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 

Bonjour

Bonjour

Tu peux écrire une requête contenant plusieurs conditions séparées par le mot clé or.


0
emrh Messages postés 427 Date d'inscription   Statut Membre Dernière intervention   20
 

J'y ai bien pensé mais j'étais sûr qu'il existait un truc plus propre, parce-que là ça fait 8 x OR.... !

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 

bonjour,

Si tu veux faire plus propre, il faut peut-être remettre en cause la structure de tes tables.

0
emrh Messages postés 427 Date d'inscription   Statut Membre Dernière intervention   20 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 

Oui, j'y ai pensé mais je ne vois pas bien comment ?

La première table "menus" contient : id_menu, nom, et  notes

La deuxième table "menu_composition" contient l'id_menu comme lien entre les deux tables et les id_recettes des plats servis en entree, plat et dessert sur les 2 repas de la journée... avec pour chaque repas le nombre de convives. (cf image postée dans ma question initiale).

On ne peut pas faire plus simple, à moins de n'en faire qu'une avec une redondance du nom et notes ?

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > emrh Messages postés 427 Date d'inscription   Statut Membre Dernière intervention  
 

La définition des tables ne doit pas être "simple".  Elle doit permettre de les utiliser correctement, et, si possible, simplement.  Tu as fait une construction simple qui conduit à une utilisation complexe.

Je ne peux pas faire de suggestion sans que tu décrives de quoi il s'agit, et ce que tu fais avec les données.

La composition du menu inclut des dates et des quantités, je trouve cela bizarre.  La composition du menu change chaque jour?

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > emrh Messages postés 427 Date d'inscription   Statut Membre Dernière intervention  
 

Tu as construit ta table en fonction du rapport à produire, comme tu ferais dans Excel.

Au lieu de supprimer une recette, pourquoi ne pas la marquer comme "non disponible"?

0
emrh Messages postés 427 Date d'inscription   Statut Membre Dernière intervention   20 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 

Comme le but est de sortir une liste de courses et un planning pour un weekend, les informations dans les tables menus, menus_composition (et d'autres tables qui n'existent pas encores comme courses par ex) sont appelées à être supprimées régulièrement.... aucun intérêt en effet de les conserver.

Par contre il n'en est pas de même pour les aliments et les recettes. Je pourrais ne pas programmer de suppression de recettes et économiser ainsi une requête tordue, mais je voulais éviter de passer par phpmyadmin pour virer une recette doublon ou une qu'on déciderait de ne plus faire pour x raison 

0
emrh Messages postés 427 Date d'inscription   Statut Membre Dernière intervention   20
 

Un truc comme ça ?

SELECT recettes.*,(
    SELECT Count(*)
    FROM   menus_composition AS M
    WHERE  M.midi_entree = recettes.id_recette
    OR M.midi_plat = recettes.id_recette
    OR M.midi_dessert = recettes.id_recette
    OR M.midi_autre = recettes.id_recette
    OR M.soir_entree = recettes.id_recette
    OR M.soir_plat = recettes.id_recette
    OR M.soir_dessert = recettes.id_recette
    OR M.soir_autre = recettes.id_recette
    ) AS Nb_menus
FROM recettes
ORDER  BY type
0
Tessel75
 

Bonjour,

Comme le dit très bien YeBe, la question n'est pas d'avoir des tables simples, ni même d'avoir des liaisons simples, mais d'avoir des tables qui permettent de limiter au maximum la saisie de données nouvelles.

Ainsi de ce que j'ai compris de ton exposé, je ferais comme suit avec les champs indiqués : 

Table Repas = > [IdRepas], [Date], [Heure (Midi/Soir)], 

Table Menus= > [IdMenus], [IdmPlats],

Table Plats= > [IdPlats], [Recette],

Table RepasMenus = > [IdrmRepas],[IdrmMenus], [Quantité],  Avec  [IdrmRepas]=[IdRepas] et [IdrmMenus] =  [IdMenus]  , cette table te permet d'enregistrer facilement les quantités servies de chacun des menus, chaque jour et pour chacun des repas midi et soir, et en même temps peut te servir à rebours pour savoir quand a été servis tel ou tel menu, et combien

ou bien Table RepasPlats= > [IdrpRepas],[IdrpPlats], [Quantité],   Avec  [IdrpRepas]=[IdRepas] et [IdrpPlats] =  [IdPlats]  , qui te permet d'enregistrer facilement les quantités servies de chacun des plats, chaque jour et pour chacun des repas midi et soir, et en même temps peut te servir à rebours pour savoir quand a été servis tel ou tel plat et combien

Ainsi, quand tu veux savoir quand et  combien de tel ou tel plat a été servi, il suffit d'appeler le plat et la recette  choisie et de lui faire cracher soit la quantité soit les dates et le moment, midi ou soir.

Bon courage. je répète : la question n'est pas d'avoir des tables simples, ni même d'avoir des liaisons simples, mais d'avoir des tables qui permettent de limiter au maximum la saisie de données nouvelles pour pouvoir en extraire les données qu'on veut obtenir.

0