Empêcher les lignes doublées

abdeslam2009 Messages postés 17 Date d'inscription lundi 12 octobre 2009 Statut Membre Dernière intervention 22 juillet 2011 - 12 oct. 2009 à 23:40
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 - 14 oct. 2009 à 16:16
Salut
j'ai tenté de sélectionner plusieurs champs dans plusieurs tables(jointures) mais le problème que j'ai rencontré les lignes retournées sont doublées.

j'ai utilisé la fonction distinct mais toujours le meme problème aussi j'ai utilisé la fonction group by les lignes retourner ne sont pas doublées mais cette fois ici une colonne qui retourne doublé voilà la requête et les tables (elles sont en jointures) vous pouvez faire copier et coler les tables dans un editeurs puis executer la requête pour les choses être en calire:

--------------------ce code est bien testé chez moi----------
-- Structure de la table `article`
--

CREATE TABLE `article` (
`article_id` int(10) NOT NULL auto_increment,
`sous_famille_id` int(10) NOT NULL,
`code_unite` int(10) default NULL,
`code_tva` int(10) default NULL,
`code_article` varchar(10) default NULL,
`designation` varchar(150) default NULL,
`observation` varchar(200) default NULL,
`prix_unitaire` decimal(15,2) default NULL,
PRIMARY KEY (`article_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=25 ;

--
-- Contenu de la table `article`
--

INSERT INTO `article` (`article_id`, `sous_famille_id`, `code_unite`, `code_tva`, `code_article`, `designation`, `observation`, `prix_unitaire`) VALUES
(1, 4, 0, 0, 'A01042', 'SALLE DE TRAITE MODEL KORU SANS MESURE_LAIT, 5 VACHES', 'teste', 150.00),
(2, 4, 0, 0, 'A01041', 'SALLE DE TRAITE MODEL KORU SANS MESURE_LAIT, 4 VACHES', 'AA', 250.00),
(4, 4, 0, 0, 'A01002', 'CHARIOT TRAYEUR BS MINI BEREKET', '', 340.00),
(5, 4, 0, 0, 'A01001', 'CHARIOT TRAYEUR BS MINI X BEREKET', '', 147.00),
(6, 4, 0, 0, 'A01004', 'CHARIOT TRAYEUR BS1 BEREKET', '', 430.00),
(7, 4, 0, 0, 'A01003', 'CHARIOT TRAYEUR BS1 X BEREKET', '', 543.00),
(8, 4, 0, 0, 'A01006', 'CHARIOT TRAYEUR BS3/1 BEREKET', '', 123.00),
(9, 4, 0, 0, 'A01005', 'CHARIOT TRAYEUR BS3/1X BEREKET', '', 65.00),
(10, 4, 0, 0, 'A01008', 'CHARIOT TRAYEUR BS3/2 BEREKET', '', 32.00),
(11, 7, 0, 0, 'B01003', 'AGNOTONIC (25 Kg)', '', 98.00),
(12, 7, 0, 0, 'B01006', 'CREMO ELEVAGE (10 Kg)', '', 98.00),
(13, 7, 0, 0, 'B01005', 'CREMO ELEVAGE (25 Kg)', '', 98.00),
(14, 7, 0, 0, 'B01004', 'VODOR ONE (25 Kg)', '', 98.00),
(15, 7, 0, 0, 'B01002', 'VODOR TA (10 Kg)', '', 98.00),
(16, 7, 0, 0, 'B01001', 'VODOR TA (25 Kg)', '', 563.00);



-- --------------------------------------------------------

--
-- Structure de la table `consultation_achat`
--

CREATE TABLE `consultation_achat` (
`consult_ach_id` int(10) NOT NULL auto_increment,
`ref_consult_ach` varchar(10) default NULL,
`date_consult_ach` date default NULL,
`etat_consult_ach` varchar(20) default NULL,
`date_etat` date default NULL,
PRIMARY KEY (`consult_ach_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=26 ;

--
-- Contenu de la table `consultation_achat`
--

INSERT INTO `consultation_achat` (`consult_ach_id`, `ref_consult_ach`, `date_consult_ach`, `etat_consult_ach`, `date_etat`) VALUES
(25, 'CA001', '2009-12-12', 'Creee', '2009-12-12');

-- --------------------------------------------------------

--
-- Structure de la table `consultation_frs`
--

CREATE TABLE `consultation_frs` (
`consult_ach_id` int(10) NOT NULL,
`fournisseur_id` int(10) NOT NULL,
`consult_frs_id` int(10) NOT NULL,
`ref_consult` varchar(15) default NULL,
`date_consult_frs` date default NULL,
`etat_consult_frs` varchar(100) default NULL,
`mode_consult_frs` varchar(50) default NULL,
`reponse_frs` varchar(50) default NULL,
`date_reponse` date default NULL,
PRIMARY KEY (`consult_ach_id`,`fournisseur_id`,`consult_frs_id`),
KEY `Consultation_Achat_FK2` (`consult_ach_id`),
KEY `Fournisseur_FK` (`fournisseur_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Contenu de la table `consultation_frs`
--

INSERT INTO `consultation_frs` (`consult_ach_id`, `fournisseur_id`, `consult_frs_id`, `ref_consult`, `date_consult_frs`, `etat_consult_frs`, `mode_consult_frs`, `reponse_frs`, `date_reponse`) VALUES
(25, 4, 1, 'RF001', '2009-12-13', 'Creee', 'Telephone', NULL, NULL),
(25, 4, 2, 'RF001', '2009-12-13', 'Creee', 'Telephone', NULL, NULL),
(25, 4, 3, 'RF001', '2009-12-13', 'Creee', 'Telephone', NULL, NULL);

-- --------------------------------------------------------

--
-- Structure de la table `consult_frs_art`
--

CREATE TABLE `consult_frs_art` (
`consult_ach_id` int(10) NOT NULL,
`article_id` int(10) NOT NULL,
`qte_consult` decimal(5,2) default NULL,
PRIMARY KEY (`consult_ach_id`,`article_id`),
KEY `Consultation_Achat_FK` (`consult_ach_id`),
KEY `Article_FK2` (`article_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Contenu de la table `consult_frs_art`
--

INSERT INTO `consult_frs_art` (`consult_ach_id`, `article_id`, `qte_consult`) VALUES
(25, 7, 23.00),
(25, 10, 12.00),
(25, 13, 10.00);

-- --------------------------------------------------------

--
-- Structure de la table `fournisseur`
--

CREATE TABLE `fournisseur` (
`fournisseur_id` int(10) NOT NULL auto_increment,
`nom_fournisseur` varchar(50) NOT NULL,
`activite` varchar(100) default NULL,
`raison_sociale` varchar(50) default NULL,
`categorie` varchar(30) default NULL,
`adresse` varchar(30) default NULL,
`code_postal` varchar(20) default NULL,
`ville` varchar(30) default NULL,
`pays` varchar(20) default NULL,
`contact` varchar(20) default NULL,
`interlocuteur` varchar(20) default NULL,
`telephone` varchar(10) default NULL,
`mobile` varchar(10) default NULL,
`email` varchar(30) default NULL,
`web` varchar(20) default NULL,
`mode_paiement_prefere` varchar(20) default NULL,
PRIMARY KEY (`fournisseur_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;

--
-- Contenu de la table `fournisseur`
--

INSERT INTO `fournisseur` (`fournisseur_id`, `nom_fournisseur`, `activite`, `raison_sociale`, `categorie`, `adresse`, `code_postal`, `ville`, `pays`, `contact`, `interlocuteur`, `telephone`, `mobile`, `email`, `web`, `mode_paiement_prefere`) VALUES
(1, '3S', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '05 22 99 2', NULL, NULL, NULL, NULL),
(2, 'AGRIDEV', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(3, 'AGSOL', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(4, 'AMAZON VERTE', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(5, 'BELGOMA', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(6, 'BRENNTAG', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(7, 'BRIOR', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(8, 'CADILHAK', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(9, 'CAPFI', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '00 22 40 7', NULL, NULL, NULL, NULL),
(10, 'CASA-MEDICAL', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(11, 'CASAPERLA', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(12, 'CLINICA', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);


------------------la fin de cration des tables-------





---voilà la requete aussi il est testé chez moi------
select consultation_frs.consult_frs_id,consult_frs_art.article_id,
fournisseur.fournisseur_id,consultation_frs.consult_ach_id
,article.code_article as code_article,consult_frs_art.qte_consult as qte_consult ,nom_fournisseur,ref_consult,date_consult_frs,etat_consult_f­rs,mode_consult_frs from article,consult_frs_art,consultation_frs,fournisseur,consult­ation_achat where fournisseur.fournisseur_id=consultation_frs.fournisseur_id and consultation_achat.consult_ach_id=consult_frs_art.consult_ac­h_id and article.article_id=consult_frs_art.article_id and consultation_achat.consult_ach_id=consultation_frs.consult_a­ch_id
-------------------------la fin de la requete------





c'est urgant je veux savoir est ce qu'il ya une autre fonction spéciale sans distint qui êmpeche les lignes doublées car je trouve ça bizzar!!!

11 réponses

syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
13 oct. 2009 à 07:53
Si tes lignes sont doublées c'est qu'il y a un souci de jointure. Remplace ton Select ... par Select * et vois l'élement qui change.
Ou alors regarde la commande Group by en SQL
S.
0
abdeslam2009 Messages postés 17 Date d'inscription lundi 12 octobre 2009 Statut Membre Dernière intervention 22 juillet 2011
13 oct. 2009 à 09:39
Bonjour
merci pour ta réponse mais la réquete est juste,j'ai essayé de remplacer select par selecr * mais toujoure le même problème
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
13 oct. 2009 à 10:20
Salut,

Non, il n'y a pas de soucis de jointure. Jetez un oeil à la doc de MySQL sur les jointures, ce comportement est tout à fait normal.
Pour deux tables possédant respectivement x et y lignes, une jointure retournera x*y lignes, c'est à dire qu'elle fera correspondre chaque ligne d'une table à chaque ligne de l'autre.
Il faut utiliser la clause WHERE pour éliminer les lignes que l'on ne veut pas. Encore une fois, tout est dans la doc.

--
Neige

N'hésitez pas à lire la doc
0
abdeslam2009 Messages postés 17 Date d'inscription lundi 12 octobre 2009 Statut Membre Dernière intervention 22 juillet 2011
13 oct. 2009 à 10:54
Ok merci je vais essayer
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
13 oct. 2009 à 12:41
Comment filtres-tu des lignes doubles avec le Where ??
Pour en revenir au select * il est là pour te donner une piste de réflexion du 'Pourquoi j'en ai plusieurs..??'
Ton souci se situe sur la colonne consult_frs_id et ta table consultation_frs
S.
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
13 oct. 2009 à 13:05
Le problème de faire des jointures, c'est qu'on obtient généralement des résultats inattendus quand on ne sait pas très précisément comment fonctionnent les jointures. Surtout quand celles-ci sont implicites.

Le mieux est encore de définir des jointures explicites (INNER JOIN, LEFT JOIN, STRAIGTH JOIN, etc) en fonction du résultat que l'on souhaite obtenir. Mais pour ça, il faut savoir précisément ce qu'on veut obtenir, ce qui implique d'être capable de reproduire manuellement (sur papier par exemple) la jointure que le SGBD va effectuer. Avancer au hasard en tatonnant ne donne jamais grand chose de vraiment positif : au final, ça peut marcher, mais on ne sait pas trop pourquoi, donc on ne pourra pas faire évoluer le code si besoin, sauf à tout recommencer, sans vraiment comprendre une fois de plus comment on va faire pour que ça fonctionne...

C'est que DBA, c'est un métier, et c'est pas le même que développeur, beaucoup de gens ont tendance à l'oublier.

--
Neige

N'hésitez pas à lire la doc
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
13 oct. 2009 à 13:59
Je suis d'accord avec toi pour les jointures, mais une fois maitrisée cette notion donne les résultat qu'on lui demande. J'avoue ma préférence pour les 'Join' aussi.
Donc pour en revenir à la problématique de notre ami je reste sur ma position, c'est le fait qu'il 3 lignes dans sa table qui 'triple' les lignes identiques.. qui par la clé 'consult_frs_id'.. ne sont pas identiques.
S.
0
abdeslam2009 Messages postés 17 Date d'inscription lundi 12 octobre 2009 Statut Membre Dernière intervention 22 juillet 2011
13 oct. 2009 à 14:24
encour j'ai essayé de resoudre le problème mais je n'arrive pas SVP si quelqu'un connait la solution me l'envoyé
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
13 oct. 2009 à 14:33
Il suffit juste de lire ce que j'ai écrit. Tiens si tu veux la solution.
S.

SELECT DISTINCT consult_frs_art.article_id, fournisseur.fournisseur_id, consultation_frs.consult_ach_id, article.code_article AS code_article, consult_frs_art.qte_consult AS qte_consult, nom_fournisseur, ref_consult, date_consult_frs, etat_consult_frs, mode_consult_frs
FROM article, consult_frs_art, consultation_frs, fournisseur, consultation_achat
WHERE fournisseur.fournisseur_id = consultation_frs.fournisseur_id
AND consultation_achat.consult_ach_id = consult_frs_art.consult_ach_id
AND article.article_id = consult_frs_art.article_id
AND consultation_achat.consult_ach_id = consultation_frs.consult_ach_id
0
abdeslam2009 Messages postés 17 Date d'inscription lundi 12 octobre 2009 Statut Membre Dernière intervention 22 juillet 2011
14 oct. 2009 à 05:11
Oui effectivement, le problème se situe sur la colonne consult_frs_id et ta table consultation_frs.

pouvez vous m'expliquer pourqoui car la jointure des tables ets juste.

Merci
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
14 oct. 2009 à 16:16
Biensur qu'elle est juste. C'est le contenu de ta table consultation_frs qui montre 3 entrée qui répondent à la jointure par leur clé.
Donc reprends ma requete et poursuis ton aventure trépidante dans MySQL
S.
0
Rejoignez-nous