2010-08-05 4 views
0

j'ai deux tablesSELECT avec MySQL une date précise à partir d'une gamme

Table A: a_id,timemarker (datetime) 

Table B: b_id,start (datetime), stop(datetime), cat(varchar) 

table A 

149|2010-07-19 07:43:45 

150|2010-07-19 08:01:34 

151|2010-07-19 07:49:12 

table B 

565447|2010-07-19 07:30:00|2010-07-19 08:00:00 

565448|2010-07-19 08:00:00|2010-07-19 08:20:00 

je veux sélectionner toutes les lignes du tableau A qui sont dans la gamme du tableau B

grâce

Répondre

0

Select A tout qui est dans QUELQUE [B.start, B.end]

select a.* 
from 
table a 
where exists (select * from table b where a.timemarker between b.start and b.stop) 
; 

L'OP écrit

J'ai des problèmes avec mes clés! la requête s'exécute très longtemps. J'ai dans la table un plus de 40k rangs et dans la table b plus de 1,4 million de lignes ... il n'y a pas de relation dans les tables - Norman il y a 3 secondes

Oui, parce que vous comparez potentiellement chaque A avec chaque B = 40k * 1,4M comparaisons. Mais votre question était "comment puis-je faire ceci", pas "voici comment je le fais, comment puis-je le rendre plus rapide".

Si vous le voulez plus rapidement, vous devez ajouter un index sur B (début, fin);

+0

J'ai des problèmes avec mes clés! la requête s'exécute très longtemps. J'ai dans le tableau a sur 40k lignes et dans le tableau b plus de 1,4 million de lignes ... il n'y a pas de lien dans les tableaux – Norman

+0

j'ai ajouté les clés, mais encore ... lent ... requête: sélectionner b. * de b où existe ( select * à partir d'un où a.timemarker = '2010-07-19 07:44:25' entre b.start et b jusqu'à ) – Norman

+0

je suis désolé .. En Allemagne, il est tard ... je suis plein de merde ... – Norman

0
SELECT a.* FROM a 
INNER JOIN b ON 
    a.timemarker BETWEEN b.start AND b.end 
GROUP BY a.id 

Je pense que cela devrait être moins cher. Bien sûr, un index supplémentaire aidera aussi :)