Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/06/2007, 18h13   #1
Membre du Club
 
Inscription : juin 2005
Messages : 220
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 220
Points : 47
Points : 47
Par défaut Jointure ne retourne rien et pourtant elle devrait la bougre

Bonjour tout le monde,

Contexte de la bizarie :

2 tables sous MySql :
-cmd_contenu et MagParAffilie
1 champs servant de jointure présent dans les 2 tables :
-idMag (varchar(9) dans les 2 tables PRIMARY KEY)

ma requete :
SELECT * FROM MagParAffilie M, cmd_contenu C WHERE M.idMag = C.idMag
=> no data retourned

Là déjà très bizare je trouve étant donné qu'il y'a au moins 200 idMag pareils dans les 2 tables.

Ensuite, si je vais dans phpmyadmin, je clic pour modifier une occurence de ma table MagParAffilie (par exemple l'occurence dont l'idMag est '36273') je la modifie même pas, juste sur "valider", et bein si je refais la requête plus haut il me sort la ligne dont l'idMag est '36273'...

Paranormal ?



Merci à ceux qui m'ont lu et un ENORME merci à ceux qui pourront m'aider

En tout cas, très bon week end !!
soad029 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2007, 21h39   #2
Membre expérimenté
 
Inscription : septembre 2006
Messages : 685
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 685
Points : 564
Points : 564
Tente de faire une réparation de tes tables, je vois que ça.
Xunil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2007, 02h38   #3
Membre du Club
 
Inscription : juin 2005
Messages : 220
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 220
Points : 47
Points : 47
Salut Xunil et merci bien pour la réponse !

Comment on fait ce genre d'opération ? j'en ai jamais entendu parler pour tout te dire...

Merci.
soad029 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2007, 07h45   #4
Membre expérimenté
 
Inscription : septembre 2006
Messages : 685
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 685
Points : 564
Points : 564
Une simple requête :

http://dev.mysql.com/doc/refman/5.0/...air-table.html

phpMyAdmin fournit cette option.
Xunil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 09h22   #5
Membre du Club
 
Inscription : juin 2005
Messages : 220
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 220
Points : 47
Points : 47
Voilà, je viens de réparer mes tables mais ma jointure ne fonctionne toujours pas...
Avez-vous d'autres idées, car je ne sais plus vers quel saint me vouer...

Merci et bonne semaine !
soad029 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 09h34   #6
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 422
Points : 6 422
Question toute bête : les 2 colonnes de la jointure ont bien le même type (une explication serait qu'une chaîne de caractères a des espaces à la fin et l'autre pas, par exemple) ?
Autre piste : écrire la jointure dans sa version standard SQL-99, avec un INNER JOIN.
Quelle est la version de MySQL ?

ced
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 11h57   #7
Membre du Club
 
Inscription : juin 2005
Messages : 220
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 220
Points : 47
Points : 47
Oui, elles sont du même type, (varchar 11 toutes les deux), j'ai testé avec l'agrégat INNER JOIN mais idem...

J'ai vérifié également s'il y avait un espace en trop dans l'un des deux champs mais non !!

C'est fou ça quand même !!

Pour info, la version de MySql est 5.0.18
soad029 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 12h47   #8
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 422
Points : 6 422
Et les deux tables sont encodées dans les mêmes jeux de caractères ?
Si les codes sont numériques, il faudrait essayer en convertissant les champs des deux tables en entiers, pour voir ce que ça donne.

ced
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 14h01   #9
Membre du Club
 
Inscription : juin 2005
Messages : 220
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 220
Points : 47
Points : 47
Les 2 tables sont bien encodés de la même manière, j'ai mis les deux champs idMag en int(8) et ça marche...

Mais le souci est que je ne pas garder ce type de format car certains de mes idMag sont : '05363' par exemple, le '0' ne passe donc pas...
soad029 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 14h21   #10
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 422
Points : 6 422
Ca confirme quand même qu'il y a un problème au niveau d'un des deux champs en chaîne de caractères...
On progresse .
Essaie maintenant en mettant UPPER(M.idMag) = UPPER(C.idMag), pour voir...

ced
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 17h12   #11
Membre du Club
 
Inscription : juin 2005
Messages : 220
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 220
Points : 47
Points : 47
Non... toujours pareil

En faite la table qui pose problème est MagParAffilie car si j'edit l'une des lignes de cette table, celle-ci apparait alors dans ma jointure (alors que je n'ai rien modifié)

Cette table est rempli à l'aide de la fonction LOAD DATA... qui permet de remplire une table avec un fichier texte.
soad029 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 19h45   #12
Membre expérimenté
 
Inscription : septembre 2006
Messages : 685
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 685
Points : 564
Points : 564
Il n'y aurait pas par hasard des espaces dans tes champs ?

Code sql :
1
2
3
SELECT * FROM MagParAffilie M 
JOIN cmd_contenu C
ON TRIM(M.idMag) = TRIM(C.idMag);
Xunil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 09h31   #13
Membre du Club
 
Inscription : juin 2005
Messages : 220
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 220
Points : 47
Points : 47
Bien vu, mais hélas ça ne marche toujours pas, par contre quand je fais un
Code :
SELECT * FROM MagParAffilie WHERE idMag = '38273'
ça ne retourne rien et
Code :
SELECT * FROM MagParAffilie WHERE idMag = 38273
fonctionne !! Voilà pourquoi mon test d'égalité ne fonctionne pas car il compare un entier avec une chaine de caractère.

Mon champ est pourtant bien en varchar... comme je le disais plus haut, il est alimenté à l'aide de la fonction LOAD DATA LOCAL INFILE :

Code en PHP :
Code :
1
2
3
4
5
 
$req = "LOAD DATA LOCAL INFILE '/home/srv/www/MaJBdD/MaJ-MagParAffilie1-.txt' REPLACE INTO TABLE MagParAffilie
LINES TERMINATED BY '\\r' ";
 
$resu = mysql_query($req);
Structure du fichier importé :
Code :
"38273","Damier","Lille"...
soad029 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 12h04   #14
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 422
Points : 6 422
Alors ta colonne n'est pas en varchar ?
Pour résoudre le problème, il faut caster en entier...
ced
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 12h31   #15
Membre du Club
 
Inscription : juin 2005
Messages : 220
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 220
Points : 47
Points : 47
Si justement.... ma colonne est bien en varchar(9)... Mais les données sont vus comme des entiers (au vu de la requête évoquée dans mon précédent post).

Comment on "caste en entier" ?

Merci pour votre implication en tout cas !!
soad029 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 14h36   #16
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 422
Points : 6 422
Citation:
Envoyé par soad029
Comment on "caste en entier" ?
Comme ça :
Code :
WHERE cast(idMag AS int) = ...
Tu peux aussi caster en chaîne de caractères (tu as le choix).

ced
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 15h46   #17
Membre du Club
 
Inscription : juin 2005
Messages : 220
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 220
Points : 47
Points : 47
Ho lala... Dans la logique des choses je me suis dis que ça allait marcher, mais non !

Déjà un exemple tout simple :

Code :
SELECT * FROM MagParAffilie WHERE idMag = cast('93101' AS int)
Erreur de syntaxe... (meme avec int(9))...

Code :
SELECT * FROM cmd_contenu WHERE idMag = cast(93101 AS char)
Fonctionne !! Donc je me suis dit que j'allais ma jointure dans ce sens, à savoir :

Code :
SELECT * FROM cmd_contenu C, MagParAffilie M WHERE cast(M.idMag AS char) = C.idMag
No data returned, pourtant j'ai bien un idMag de 93101 dans les deux tables...
soad029 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 15h54   #18
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 422
Points : 6 422
Essaie en castant des deux côtés de la jointure, et en précisant une longueur de char (char(5) si tous les id font 5 en longueur).

ced
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 16h17   #19
Membre du Club
 
Inscription : juin 2005
Messages : 220
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 220
Points : 47
Points : 47
Toujours pareil en faite :
Code :
1
2
 
SELECT * FROM cmd_contenu C, MagParAffilie M WHERE cast(M.idMag AS char(5)) = cast(C.idMag AS char(5))
=> No data retourned
soad029 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 16h58   #20
Membre chevronné
 
Avatar de pop_up
 
Inscription : avril 2006
Messages : 833
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 833
Points : 690
Points : 690
Je prend la discussion en cours juste pour verifier :

Code :
SELECT cast('93101' AS int);
chez moi rien que ça ça ne marche pas
ça marche chez vous ?

moi je fais

Code :
SELECT cast('93101' AS SIGNED);
peut etre ça aidera
pop_up est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h49.


 
 
 
 
Partenaires

Hébergement Web