INNER JOIN et Like

INNER JOIN et Like - SQL/NoSQL - Programmation

Marsh Posté le 15-03-2008 à 14:08:11    

Bonjour.
 
Je possède deux tables dont voici les champs et les valeurs qui nous interessent.
"PROSPECT"
id_prospect (1213243435)
 
"SANTE"
id_sante (1213243435-0)
 
Les deux ID sont les mêmes au -xxxxxxx prêt.
J'effectue donc cette requête.

Citation :


SELECT *
FROM PROSPECT
INNER JOIN sante ON prospect.ID_PROSPECT like CONCAT(sante.IDSANTE, '%')


 
Cela ne retourne aucun resultat.
Comment cela se fait il?
 
Merci.

Reply

Marsh Posté le 15-03-2008 à 14:08:11   

Reply

Marsh Posté le 18-03-2008 à 19:33:04    

comment c'est trop de la merde skype, il me propose d'appeler aux USA ton id_sante :D
 
à mon avis, c'est assez moyen de faire un like dans un critère de jointure.
 
quel est le sgbd que tu utilises ?

Reply

Marsh Posté le 18-03-2008 à 19:34:48    

accessoirement, quels sont les types de tes champs id_prospect et id_sante ? (ça sent le CHAR ça...)

Reply

Marsh Posté le 18-03-2008 à 19:44:34    

Avec SQL Server 2005 :
 

Code :
  1. print('Jointure sur LIKE');
  2. print('Exemple avec VARCHAR(10)');
  3. CREATE TABLE t1
  4. (
  5.     id varchar(10) NOT NULL PRIMARY KEY,
  6.    nom varchar(50) NOT NULL
  7. )
  8. go
  9.  
  10. CREATE TABLE t2
  11. (
  12.     id varchar(10) NOT NULL PRIMARY KEY,
  13.    nom varchar(50) NOT NULL
  14. )
  15. go
  16.  
  17. INSERT INTO t1 (id, nom) VALUES ('1', 'Test 1');
  18. INSERT INTO t1 (id, nom) VALUES ('2', 'Test 2');
  19.  
  20. INSERT INTO t2 (id, nom) VALUES ('1-1', 'Test 1.1');
  21. INSERT INTO t2 (id, nom) VALUES ('1-2', 'Test 1.2');
  22. INSERT INTO t2 (id, nom) VALUES ('3-1', 'Test 3.1');
  23. INSERT INTO t2 (id, nom) VALUES ('3-2', 'Test 3.2');
  24.  
  25. SELECT *
  26. FROM t1
  27. INNER JOIN t2 ON t2.id LIKE t1.id + '%';
  28.  
  29. DROP TABLE t2
  30. go
  31. DROP TABLE t1
  32. go
  33.  
  34. print('Exemple avec CHAR(10)');
  35. CREATE TABLE t1
  36. (
  37.     id char(10) NOT NULL PRIMARY KEY,
  38.    nom varchar(50) NOT NULL
  39. )
  40. go
  41.  
  42. CREATE TABLE t2
  43. (
  44.     id char(10) NOT NULL PRIMARY KEY,
  45.    nom varchar(50) NOT NULL
  46. )
  47. go
  48.  
  49. INSERT INTO t1 (id, nom) VALUES ('1', 'Test 1');
  50. INSERT INTO t1 (id, nom) VALUES ('2', 'Test 2');
  51.  
  52. INSERT INTO t2 (id, nom) VALUES ('1-1', 'Test 1.1');
  53. INSERT INTO t2 (id, nom) VALUES ('1-2', 'Test 1.2');
  54. INSERT INTO t2 (id, nom) VALUES ('3-1', 'Test 3.1');
  55. INSERT INTO t2 (id, nom) VALUES ('3-2', 'Test 3.2');
  56.  
  57. SELECT *
  58. FROM t1
  59. INNER JOIN t2 ON t2.id LIKE t1.id + '%';
  60.  
  61. DROP TABLE t2
  62. go
  63. DROP TABLE t1
  64. go


 
Résultat :


Jointure sur LIKE
Exemple avec VARCHAR(10)
 
(1 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
id         nom                                                id         nom
---------- -------------------------------------------------- ---------- --------------------------------------------------
1          Test 1                                             1-1        Test 1.1
1          Test 1                                             1-2        Test 1.2
 
(2 ligne(s) affectée(s))
 
Exemple avec CHAR(10)
 
(1 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
id         nom                                                id         nom
---------- -------------------------------------------------- ---------- --------------------------------------------------
 
(0 ligne(s) affectée(s))
 


 
Je te laisse comprendre pourquoi :


"1         "


N'est pas reconnu comme le début de :


"1-1"

Reply

Marsh Posté le 20-03-2008 à 11:00:31    

Merci pour ces réponses.
 
Je classe l'affaire.
C'est donc pas adapté.

Reply

Marsh Posté le 20-03-2008 à 19:21:11    

Bon moi j'ai un probleme plus ou moins similaire, je profite donc de ce nom de topic qui me semble adapter
 
j'ai 2 tables
 
table 1 :
|id|nom|prenom|adresse|
 
table 2 (avec uid = table1.id)
id|uid|entreprise|adresse_entreprise|
 
 
 
en gros dans mon moteur de recherche  si je tape :jean-paul
 
il m'affiche tout les "jean-paul" avec  leur metié associé (ils peuvent en avoir plusiseur metier)
 
si je tape "la poste"   il m'affiche tout ceux qui on un travail a la poste
 
 
si je tape  "pierre"  mais que pierre n'a pas d'emplois (oui ca arrive)  
la ca m'affiche rien
 
voici mon type de requete si par exemple je cherche : pierre
 

Code :
  1. SELECT SQL_CALC_FOUND_ROWS *
  2. FROM `table_membres`
  3. INNER JOIN `table_emplois`
  4.          ON `table_membres`.`id`=`table_emplois`.`uid`
  5. WHERE `table_membres`.`visible`=1
  6.         AND CONCAT_WS( '~', COALESCE( `table_membres`.`prenom` , '' ),
  7.                         COALESCE( `table_membres`.`nom_usage` , '' ),
  8.                         COALESCE( `table_membres`.`nom_ecole` , '' ),
  9.                         COALESCE( `table_membres`.`ville` , '' ),
  10.                         COALESCE( `table_membres`.`date_entrer` , '' ),
  11.                         COALESCE( `table_membres`.`filliere` , '' ),
  12.                         COALESCE( `table_membres`.`memoire` , '' ),
  13.                         COALESCE( `table_emplois`.`poste` , '' ),
  14.                         COALESCE( `table_emplois`.`organisme` , '' ),
  15.                         COALESCE( `table_emplois`.`sigle` , '' ),
  16.                         COALESCE( `table_emplois`.`ville` , '' ),
  17.                         COALESCE( `table_membres`.`ecole_origine` , '' ) )
  18. LIKE CONVERT(_utf8 '%pierre%' USING latin1 )
  19.         COLLATE latin1_swedish_ci
  20. GROUP BY `table_membres`.`id`
  21. ORDER BY date_entrer
  22. DESC LIMIT 0, 10

 
 


Message édité par stealth35 le 20-03-2008 à 19:21:54
Reply

Marsh Posté le 20-03-2008 à 22:31:22    

masseur a écrit :

Merci pour ces réponses.
 
Je classe l'affaire.
C'est donc pas adapté.


Relis ma réponse, c'est en rien inadapté... C'est juste que selon le type que tu utilises (un char en l'occurence) il faut faire attention. Les fonctions de trim() te permettrons de virer sans aucun problème les espaces ajoutés automatiquement par le type char...
 
sleath35 > rien à voir comme problème. tu dois utiliser une jointure "externe". cf. ma signature pour une description complète des différents types de jointures et des exemples.

Reply

Marsh Posté le 20-03-2008 à 23:06:59    

Autant pour moi, j'avais lu trop vite.
Désolé et merci.

Reply

Marsh Posté le 21-03-2008 à 00:41:16    

MagicBuzz a écrit :


sleath35 > rien à voir comme problème. tu dois utiliser une jointure "externe". cf. ma signature pour une description complète des différents types de jointures et des exemples.


merci d'etre aussi rapide, c'est exactememnt ce qu'il me fallais  :love:  
sauf que la ca me surprime l'id de la table de membre si la personne n'a pas d'emplois, de plsu la recherche est extrement lente ???

Reply

Marsh Posté le 21-03-2008 à 10:50:03    

bon ca marche mais c'est super lent...
doit bien y avoir un moyen d'optimiser ça, j'arrive a 9sec pour une requête c'est beaucoup trop long


Message édité par stealth35 le 21-03-2008 à 10:57:33
Reply

Marsh Posté le 21-03-2008 à 10:50:03   

Reply

Marsh Posté le 25-03-2008 à 20:20:36    

pas d'idées ?

Reply

Marsh Posté le 27-03-2008 à 10:22:05    

c'est normal que ce soit lent car la jointure peut pas se faire sur un index, donc il fait un fullscan à chaque fois de la table
 
en fait X like "blabla%" peut utiliser un index, par contre X like "%blabla" ou "%blabla%" ça peut plu utiliser d'index
 
de même si tu rajoute un convert ( ), lower ( ), upper ( ) ou autre conversion de colone, ça passera plus par l'index de la colone, donc il fait un fullscan et compare champ par champ.
 
pareil pour le truc de masseur
 
une solution c'est d'utiliser une colone générée qui permetra de précalculer la valeur de la colone et sur laquelle tu pourras définir un index
 
 

Citation :

"PROSPECT"
id_prospect (1213243435)
 
"SANTE"
id_sante (1213243435-0)
 
Les deux ID sont les mêmes au -xxxxxxx prêt.


 
par exemple là tu fais dans ta table SANTE une colone générée à partir de id_sante qui tronquera là partie -xxxxxxx et un index dessus, et tu feras ta jointure sur cette colone
 
avec certaines base de donnée, si tu fait un lower, la base est capable de faire appel au champ généré de façon transparente, si tu joins sur la colone d'origine dans ta requete.


Message édité par basketor63 le 27-03-2008 à 10:24:50
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed