SQL 2 tables

Fermé
DAG - 10 sept. 2008 à 18:06
 DAG - 15 sept. 2008 à 11:51
Bonjour,
Je suis un peu perdu en SQL.
J'ai une table user et une table secteurs. La table user contient des infos relatives aux utilisateurs comme le nom, prenom, ville, rue, code, postale.... La table secteur fait la correspondance entre leur adresse et leur secteur.

Dans la table des utilisateurs j'ai champs secteur qui est vide. Et j'aimerais bien le complété. Pour cela il faut que je fasse la comparaison entre la rue de la table user et la rue de la table secteur afin de déterminer le secteur.

J'ai essayer de faire ce genre de chose :
SELECT t2.secteur FROM (users AS t1 INNER JOIN secteur AS t2) 
WHERE 
(
        t1.adresse_pro_OD LIKE '%'||t2.rue||'%'
) 

Je pensais effectuer cette requête puis dans un while($data = mysql_fetch_array... faire mon update...(je travail en PHP)

Le problème est que la première requête me retourne plus de 23000 lignes... Sachant que je doit avoir un peu plus de 5000 users... Donc je ne comprend pas et je ne sais plus trop comment faire !

Est-ce que quelqu'un aurai une idée ?
A voir également:

5 réponses

Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010 1 389
11 sept. 2008 à 14:59
Bonjour,

Dans ton ordre INNER JOIN, tu n'as pas mis une condition, je pense que l'ordre devrait être le suivant
SELECT t2.secteur FROM (users AS t1 INNER JOIN secteur AS t2 ON t1.adresse_pro_OD = t2.rue)

Je pense également que tu dois aussi sélectionné une variable de ta table USERS pour pouvoir la mettre à jour, le mieux étant ce qui rend chaque utilisateur unique (clé primaire).
A plus
1
Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010 1 389
15 sept. 2008 à 11:09
Bonjour,

Désolé pour la réponse tardive, j'étais à l'étranger.
Concernant ta question, je ne pense pas qu'il soit possible de faire un INNER JOIN avec un LIKE, tu peux peut-être faire le suivant
SELECT  t1.ID, t1.nom_OD, t1.prenom_OD, t1.adresse_pro_OD from users as t1 where t1.secteur = ' '

Cela te donnera tous les utilisateurs dont le secteur est vide et ensuite pour chaque record tu peux faire le suivant
SELECT t2.secteur from secteur as t2 where t1.adresse_pro_OD like '%'||t2.rue||'%'

Cela devrait te donner le secteur ou les secteurs car je suppose qu'il peut avoir plus d'une fois le même nom de rue dans ta table secteur.
Tu peux peut-être aussi essayer le code suivant
SELECT t1.ID, t1.nom_OD, t1.prenom_OD, t1.adresse_pro_OD, t2.rue, t2.secteur
FROM users AS t1 INNER JOIN secteur AS t2 ON left(t1.adresse_pro_OD,length(t2.rue)) = t2.rue

Cela va comparé la partie gauche de adress_pro_OD sur un nombre de caractères égal au nombre de caractères des rues de ta table secteur. A toi de voir
A plus
1
Merci pour ta réponse.
En fait je pensais aussi que ça pourrait marcher, mais comment faire pour mettre le LIKE ?

Car je suis confronté à un autre probleme :
- Le champs t1.adresse_pro_OD est formé de la façon suivante : nom_de_rue + code postal + ville. Le tout dans le même champs de ma base... J'ai pas le choix, c'est comme ça !
- Et le champs t2.rue ne contient que le nom de la rue...

J'essaie donc de retrouver le nom de la rue t2.rue dans le champs t1.adresse_pro_OD...

Je ne sais pas si tu aurai une idée ? Elel serait la bien venue !! (Il est peut être aussi possible de le faire dans le code, je code en PHP)

A+
0
Rah je me suis trompé ! J'avais laissé le "=" devant le LIKE ! Désolé !
Mais sinon ça ne marche toujours pas !
En faisant comme ça :
SELECT t1.ID, t1.nom_OD, t1.prenom_OD, t1.adresse_pro_OD, t2.rue, t2.secteur FROM (users AS t1 INNER JOIN secteur  AS t2 ON t1.adresse_pro_OD LIKE '%'||t2.rue||'%') 

Il me ressort (en peu de temps !) environs 98 000 linges... Alors que je n'est qu'enivrons 5000 utilisateurs...
Je ne comprend pas !

Merci de m'indiquer si tu as une idée !?
0

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

Posez votre question
ça maaaaarche ! Merci beaucoup !! Vraiment !
ça fait plusieurs jours que j'étais sur cette requête (que je ne trouve pas évidente du tout !), et je ne suis pas super à l'aise avec SQL ! Je ne connaissais pas l'utilisation de length.

En fait ça marche avec la deuxième méthode que tu m'as donnée. La première ne marche pas, en plus je crois l'avoir déjà testée. Il me ressort plein de choses erronnées. Par contre avec :
SELECT t1.ID, t1.nom_OD, t1.prenom_OD, t1.adresse_pro_OD, t2.rue, t2.secteur
FROM users AS t1 INNER JOIN secteur AS t2 ON left(t1.adresse_pro_OD,length(t2.rue)) = t2.rue

ça marche impeccable !

Merci encore !

A+
0