|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Inscription : juillet 2006 Messages : 144 ![]() |
Voilà le problème :
Soit une table avec des id_user et des id_lieu id_user | id_lieu 1 | 1 1 | 2 2 | 1 2 | 2 2 | 3 3 | 1 4 | 1 4 | 3 Je veut tout les Id_user qui fréquente a la fois les Id_lieu '1' et '2' Je me doute qu'il faut faire un intersection chose que je sais faire en SQL avec INTERSECT mais malheureusement c'est pas dispo en MySQL donc je me suis rabattu sur une syntaxe avec IN mais impossible de trouvé la bonne syntaxe. Une idée ? |
|
|
00
|
|
|
#2 | ||||
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Code :
Code :
|
||||
|
|
00
|
|
|
#3 | ||
![]() ![]() Michel Consultant informatique Inscription : mai 2005 Messages : 3 006 ![]() |
salut,
je ne sais pas au niveau performance par rapport aux requetes d'Antoun, mais je ferais quelque chose dans ce genre : Code :
|
||
|
|
00
|
|
|
#4 | |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Citation:
|
|
|
|
00
|
|
|
#5 | ||||||
|
Invité régulier
![]() Inscription : décembre 2006 Messages : 9 ![]() |
La solution proposée marche bien, mais sa réalisation peut prendre des plombes .
Mettons que tu aies 2 listes de personnes: list_A and list_B. Tu veux savoir quelles sont les personnes qui sont dans A et pas dans B. D'un point de vue ensembliste, tu cherches à faire "A moins B". Solution facile, mais qui prend du temps: select person from list_A where person not in (select person from list_B); Dans mon cas, 2 listes de quelques milliers de lignes suffisent à mettre mon serveur 1GB à genoux pendant qqes minutes. Le temps de calcul est divisé par 1000 en utilisant l'algorithme suivant: 1/ crée une table temporaire où tu dumpes les 2 listes 2/ utilise les fonctions "group" de mysql pour séparer les éléments de l'intersection des éléments hors-intersection Exemple: Code :
-> "A moins B": Code :
-> "B moins A": Code :
Code :
SELECT person FROM dump GROUP BY person HAVING count(*)='2'; Bon courage! Sibawe |
||||||
|
|
00
|
|
|
#6 |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
En fait, le problème vient du IN qui est super mal optimisé... Il doit être possible de faire qqch avec EXISTS qui soit efficace.
|
|
|
00
|
|
|
#7 | ||
|
Invité de passage
![]() Inscription : septembre 2009 Messages : 4 ![]() |
Je vais devoir réaliser des intersection multiples. pour ce faire j'hésite entre 2 approches :
1/ tout mettre dans une seule table et je lance ce genre de requête : Code :
Sachant qu'Il y aura plusieurs dizinaines de millier de "users" et des centaines de lieux. - Y a t-il un intérêt en terme de perf a utiliser la solution 2 ? - si oui, quelle genre de requête dois-je réaliser ? - si non, comment optimiser la solution 1 ? |
||
|
|
00
|
|
|
#8 |
![]() ![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 3 823 ![]() |
Bonjour,
S'il y a plusieurs centaines de lieux, il ne faut surtout pas créer une table par lieu... A chaque fois qu'il faudra ajouter un lieu, il faudra une nouvelle table, ce qui est ingérable ! Pour "optimiser" la solution 1, il faut prendre la dernière requête proposée : Code :
SELECT id_user FROM ta_table WHERE id_lieu IN (1, 2, 3, 4) GROUP BY id_user HAVING count(*)= 4;
__________________
Rédacteur / Modérateur SGBD Mes tutoriels et la FAQ MySQL ---------------------------------------------------- Pensez aux balises code et au tag Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
|
|
|
00
|
|
|
#9 |
|
Invité de passage
![]() Inscription : septembre 2009 Messages : 4 ![]() |
Merci pour cette réponse
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com