Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
870 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  INNER JOIN et Like

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

INNER JOIN et Like

n°1702830
masseur
Posté le 15-03-2008 à 14:08:11  profilanswer
 

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.

mood
Publicité
Posté le 15-03-2008 à 14:08:11  profilanswer
 

n°1704253
MagicBuzz
Posté le 18-03-2008 à 19:33:04  profilanswer
 

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 ?

n°1704254
MagicBuzz
Posté le 18-03-2008 à 19:34:48  profilanswer
 

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

n°1704257
MagicBuzz
Posté le 18-03-2008 à 19:44:34  profilanswer
 

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"

n°1705198
masseur
Posté le 20-03-2008 à 11:00:31  profilanswer
 

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

n°1705619
stealth35
Posté le 20-03-2008 à 19:21:11  profilanswer
 

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
n°1705739
MagicBuzz
Posté le 20-03-2008 à 22:31:22  profilanswer
 

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.

n°1705749
masseur
Posté le 20-03-2008 à 23:06:59  profilanswer
 

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

n°1705756
stealth35
Posté le 21-03-2008 à 00:41:16  profilanswer
 

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 ???

n°1705876
stealth35
Posté le 21-03-2008 à 10:50:03  profilanswer
 

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
mood
Publicité
Posté le 21-03-2008 à 10:50:03  profilanswer
 

n°1707601
stealth35
Posté le 25-03-2008 à 20:20:36  profilanswer
 

pas d'idées ?

n°1708545
basketor63
LFI et le PC ne sont pas d'EG
Posté le 27-03-2008 à 10:22:05  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  INNER JOIN et Like

 

Sujets relatifs
Oracle - besoin d'aide pour un outer join [JS] Problème de value et d'incertion de lien dans inner.HTML
Mysql - LEFT JOIN Multiple sur une même tablerequete utilisant LIKE %%
Google Calendar like ? ?[XSLT] Générer une documentation "javadoc/doxygen"-like
Peer-to-peer légal : Jamendo Like[RESOLU]Comptage impossible ou pb avec mon "left join" ?
[MySQL] SELECT avec LEFT JOIN et LIMITMySQL - Optimisation d'une requête avec plusieurs JOIN
Plus de sujets relatifs à : INNER JOIN et Like


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR