IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Comment puis extraire les donnée d une recette qui a QUE des fruits actif [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 098
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 098
    Points : 946
    Points
    946
    Par défaut Comment puis extraire les donnée d une recette qui a QUE des fruits actif
    Bonjour,
    Je fais un petit application de recette

    J'ai trois table
    1. tb_recettes
    2. tb_recettes_ingredients
    3. tb_fruits


    1. Dans tb_recettes, j'ai toutes mes recettes, une ligne par recette
    2. Dans tb_fruits, j'ai tous mes fruits, ou ingredients, une ligne par fruit. Si j ai plus de fruit, je peux les deactivé
    3. Dans tb_recettes_ingredients, j'ai le contenu de mes recttes. Si ma recette 2, a une pomme, une poire et une banane, j'aurais trois ligne et deux colonmnes (tb_recettes_id_recette, tb_fruits_id_fruits). Donc trois ligne avec la colonne "tb_recettes_id_recettes" avec la valeur de 2, et la colonne "tb_fruits_id_fruits" avec la valeur de l ID du fruits


    Mon probleme, c'est que si l'un de ses fruits est inactif (colonne : fd_actived), je ne veux pas que la recette s'affiche.

    Ci-dessous, j'âi ma requette SQL avec jointure et dans ma table j'ai 2 fruits inactif. J'ai une recette qui a 4 fruits donc les deux inactif. MAis la recette s'affiche comme même car mon code ci-dessous detecte que il y a au moin 1 fruit actif.

    J'aimerais savoir comment modifier ma requete MYSQL de sorte qu'il ne considaire que les recettes dont tous les fruits sont actif.

    Voyez vous mon probleme? Ai-je ete assez explicite

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $sql_recettes_mod = "	SELECT 
    									r.fd_nom, r.id_recettes, r.fd_actived, ri.tb_recettes_id_recettes, ri.tb_fruits_id_fruits, f.id_fruits, f.fd_actived
    								FROM 
    									tb_recettes AS r 
    								INNER JOIN tb_recettes_ingredients AS ri ON r.id_recettes = ri.tb_recettes_id_recettes
    								INNER JOIN tb_fruits AS f ON ri.tb_fruits_id_fruits = f.id_fruits
     
    								WHERE 
    									r.fd_actived LIKE 1 AND f.fd_actived LIKE 1
    								GROUP BY r.fd_nom 
    								ORDER BY r.id_recettes ASC";
    		$query_recettes_mod = mysql_query($sql_recettes_mod)or die(mysql_error());
    		$no_recettes_mod = mysql_num_rows($query_recettes_mod);


    Milles mercis pour vos lumières

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    essaie en remplacant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INNER JOIN tb_fruits AS f ON ri.tb_fruits_id_fruits = f.id_fruits
    WHERE r.fd_actived LIKE 1 AND f.fd_actived LIKE 1
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INNER JOIN tb_fruits AS f 
    ON (ri.tb_fruits_id_fruits = f.id_fruits AND f.fd_actived = 1)
    Sinon, donne-nous un extrait de tes tables, qu'on puisse tester.

  3. #3
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Bonjour,

    Si j'ai bien compris la structure de ton modéle, il va falloir passer par deux étapes:
    Une première qui est une boucle avec une jointure des recettes et des ingrédients puis pour chaque résultat une étape de recherche si dans les fruits ils en existent encore. Je ne vois pas autrement car dans tous les cas pour vos requêtes, elles éliminent effectivement des lignes avec des ingrédients fruit qui n'existe plus mais pas la recette par elle-même.

    Donc soit cette possibilité ou refléchier a un autre modéle qui partirait plutôt des fruits vers des recettes, comme celà plus de ce fruits implique plus des recettes contenant ce dernier ...

  4. #4
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 098
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 098
    Points : 946
    Points
    946
    Par défaut
    Bonjour.
    Je vous remercie pour vos reponse. Je suis en formation. Je vais prendre le temps de les etudier et vous repondre dans la journée

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 098
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 098
    Points : 946
    Points
    946
    Par défaut
    Meci jreaux
    Malheureusement ca ne marche pas.

    Voici mes tables (la table tb_nutrition) n est pas encore utilisee
    Code MSQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
     
    -- phpMyAdmin SQL Dump
    -- version 3.5.1
    -- http://www.phpmyadmin.net
    --
    -- Host: localhost
    -- Generation Time: Sep 24, 2012 at 11:01 AM
    -- Server version: 5.5.25
    -- PHP Version: 5.4.4
     
    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
    SET time_zone = "+00:00";
     
    --
    -- Database: `db_typ`
    --
     
    -- --------------------------------------------------------
     
    --
    -- Table structure for table `tb_fruits`
    --
     
    CREATE TABLE `tb_fruits` (
      `id_fruits` int(11) NOT NULL AUTO_INCREMENT,
      `fd_nom` varchar(45) DEFAULT NULL,
      `fd_description` longtext,
      `fd_calories` decimal(5,2) DEFAULT NULL,
      `fd_lipide` decimal(5,2) DEFAULT NULL,
      `fd_cholesterol` decimal(5,2) DEFAULT NULL,
      `fd_glucides` decimal(5,2) DEFAULT NULL,
      `fd_sucre` decimal(5,2) DEFAULT NULL,
      `fd_proteine` decimal(5,2) DEFAULT NULL,
      `fd_fibre` decimal(5,2) DEFAULT NULL,
      `fd_prix_100g` decimal(5,2) DEFAULT NULL,
      `fd_poids_dosette` decimal(5,2) DEFAULT NULL,
      `fd_unite` varchar(8) NOT NULL,
      `fd_actived` int(11) NOT NULL DEFAULT '1',
      PRIMARY KEY (`id_fruits`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=13 ;
     
    --
    -- Dumping data for table `tb_fruits`
    --
     
    INSERT INTO `tb_fruits` (`id_fruits`, `fd_nom`, `fd_description`, `fd_calories`, `fd_lipide`, `fd_cholesterol`, `fd_glucides`, `fd_sucre`, `fd_proteine`, `fd_fibre`, `fd_prix_100g`, `fd_poids_dosette`, `fd_unite`, `fd_actived`) VALUES
    (1, 'Orange', 'Riche en vitamine C', 1.10, 2.10, 0.33, 0.00, 0.11, 0.00, 0.00, 0.01, 10.00, 'g', 1),
    (2, 'Poire', 'Pour les sportifs', 1.10, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 'g', 1),
    (3, 'pomme', '', 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 'g', 0),
    (4, 'Kiwi', 'Très riche en vitamine', 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 'dosette', 0),
    (5, 'raisin', 'faire du vin', 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 'g', 1),
    (6, 'mangue', 'exotique', 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 'g', 1),
    (7, 'Lait de coco', '', 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 'l', 1),
    (8, 'fraise', '', 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 'g', 1),
    (9, 'framboise', '', 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 'g', 0),
    (10, 'Ju d''orange', '', 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 'l', 1),
    (11, 'Noix de coco', '', 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 'g', 1),
    (12, 'Ananas', '', 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 'g', 1);
     
    -- --------------------------------------------------------
     
    --
    -- Table structure for table `tb_nutrition`
    --
     
    CREATE TABLE `tb_nutrition` (
      `id_nutrition` int(11) NOT NULL AUTO_INCREMENT,
      `fd_name` varchar(45) DEFAULT NULL COMMENT 'fibre, sans gluten, santé du coeur, végétarien, sans sucre, booster',
      `tb_recettes_id_recettes` int(11) NOT NULL,
      PRIMARY KEY (`id_nutrition`),
      KEY `fk_tb_nutrition_tb_recettes1_idx` (`tb_recettes_id_recettes`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
     
    -- --------------------------------------------------------
     
    --
    -- Table structure for table `tb_recettes`
    --
     
    CREATE TABLE `tb_recettes` (
      `id_recettes` int(11) NOT NULL AUTO_INCREMENT,
      `fd_nom` varchar(45) NOT NULL,
      `fd_description` longtext,
      `fd_date_create` datetime NOT NULL,
      `fd_actived` int(11) NOT NULL,
      PRIMARY KEY (`id_recettes`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=20 ;
     
    --
    -- Dumping data for table `tb_recettes`
    --
     
    INSERT INTO `tb_recettes` (`id_recettes`, `fd_nom`, `fd_description`, `fd_date_create`, `fd_actived`) VALUES
    (17, 'recette 2', '', '2012-09-12 01:09:07', 0),
    (18, 'Recette teste', '', '2012-09-23 16:09:36', 1),
    (19, 'test 22222', '', '2012-09-23 22:09:44', 1);
     
    -- --------------------------------------------------------
     
    --
    -- Table structure for table `tb_recettes_ingredients`
    --
     
    CREATE TABLE `tb_recettes_ingredients` (
      `id_ingredients` int(11) NOT NULL AUTO_INCREMENT,
      `tb_recettes_id_recettes` int(11) NOT NULL,
      `tb_fruits_id_fruits` int(11) NOT NULL,
      `fd_quantite` decimal(5,2) NOT NULL,
      PRIMARY KEY (`id_ingredients`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=33 ;
     
    --
    -- Dumping data for table `tb_recettes_ingredients`
    --
     
    INSERT INTO `tb_recettes_ingredients` (`id_ingredients`, `tb_recettes_id_recettes`, `tb_fruits_id_fruits`, `fd_quantite`) VALUES
    (24, 17, 1, 0.10),
    (25, 18, 8, 1.00),
    (26, 18, 10, 2.00),
    (27, 18, 4, 4.00),
    (28, 18, 3, 6.00),
    (30, 19, 6, 3.00);
     
    --
    -- Constraints for dumped tables
    --
     
    --
    -- Constraints for table `tb_nutrition`
    --
    ALTER TABLE `tb_nutrition`
      ADD CONSTRAINT `fk_tb_nutrition_tb_recettes1` FOREIGN KEY (`tb_recettes_id_recettes`) REFERENCES `tb_recettes` (`id_recettes`) ON DELETE NO ACTION ON UPDATE NO ACTION;
    Donc par exemple dans la recette "recette teste" elle est deux fruit "pomme" et " kiwi" qui sont inactif, mais compris dans cette dernier. Donc cette recette ne doit pas s'afficher.

    Il ny aurait pas la possiblite d'utiliser un "count"?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Re-bonjour,
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $sql_recettes_mod = 
    "SELECT 
    r.fd_nom, r.id_recettes, r.fd_actived, ri.tb_recettes_id_recettes, ri.tb_fruits_id_fruits, f.id_fruits, f.fd_actived
    FROM 
    tb_recettes AS r 
    INNER JOIN tb_recettes_ingredients AS ri ON r.id_recettes = ri.tb_recettes_id_recettes
    INNER JOIN tb_fruits AS f ON ri.tb_fruits_id_fruits = f.id_fruits
    WHERE r.id_recettes NOT IN
    	(SELECT DISTINCT tb_recettes_id_recettes 
    	FROM tb_recettes_ingredients AS ri
    	INNER JOIN tb_fruits AS f ON (ri.tb_fruits_id_fruits = f.id_fruits AND f.fd_actived = 0))
    GROUP BY r.fd_nom 
    ORDER BY r.id_recettes ASC;
    ";
    Explication :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	(SELECT DISTINCT tb_recettes_id_recettes 
    	FROM tb_recettes_ingredients AS ri
    	INNER JOIN tb_fruits AS f ON (ri.tb_fruits_id_fruits = f.id_fruits AND f.fd_actived = 0))
    => sélection dans "tb_recettes_ingredients" des id-recettes (DISTINCT) dont un ingrédient (fruit) AU MOINS EST désactivé ( ... = 0).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE r.id_recettes NOT IN ...
    => id_recettes qui NE sont PAS dans cette liste d'id_recettes (dont un ingrédient AU MOINS est désactivé)
    Et donc par conséquent => ceux dont TOUS les ingrédients SONT activés.

  7. #7
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 098
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 098
    Points : 946
    Points
    946
    Par défaut
    C'est super, ca marche.
    J ai pas tout compris mais je vais prendre le temps de bien lire ligne par ligne.
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 28/05/2008, 15h29
  2. Comment lire/utiliser les données d'une ADOTable ?
    Par melles dans le forum Bases de données
    Réponses: 3
    Dernier message: 02/09/2007, 04h43
  3. Réponses: 1
    Dernier message: 26/01/2007, 08h15
  4. Réponses: 1
    Dernier message: 02/11/2006, 10h40
  5. Réponses: 1
    Dernier message: 12/09/2006, 14h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo