Empêcher les lignes doublées

Signaler
Messages postés
17
Date d'inscription
lundi 12 octobre 2009
Statut
Membre
Dernière intervention
22 juillet 2011
-
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
-
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

Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
16
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.
Messages postés
17
Date d'inscription
lundi 12 octobre 2009
Statut
Membre
Dernière intervention
22 juillet 2011

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
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
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
Messages postés
17
Date d'inscription
lundi 12 octobre 2009
Statut
Membre
Dernière intervention
22 juillet 2011

Ok merci je vais essayer
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
16
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.
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
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
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
16
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.
Messages postés
17
Date d'inscription
lundi 12 octobre 2009
Statut
Membre
Dernière intervention
22 juillet 2011

encour j'ai essayé de resoudre le problème mais je n'arrive pas SVP si quelqu'un connait la solution me l'envoyé
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
16
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
Messages postés
17
Date d'inscription
lundi 12 octobre 2009
Statut
Membre
Dernière intervention
22 juillet 2011

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
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
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.