2009-10-01 6 views
0

configuration:Comment sélectionner le résultat souhaité dans MySQL?

create table main(id integer unsigned);  
create table test(id integer unsigned,created datetime,text text); 

insert into main value(1); 
insert into test value(1,now(),'something1');  
insert into test value(1,now() + interval 1 day,'something2'); 

utilisant:

select main.id, text from main left join test on main.id=test.id 
group by main.id where main.id in (1,2,3); 

retours:

+------+------------+ 
| id | text  | 
+------+------------+ 
| 1 | something1 | 
+------+------------+ 

Comment obtenir

+------+------------+ 
| id | text  | 
+------+------------+ 
| 1 | something2 | 
+------+------------+ 
+0

Que voulez-vous dire plusieurs main.id? S'il vous plaît fournir des exemples d'entrée et de sortie, merci. –

+0

Non, ne peut pas utiliser la limite 1, de cette façon il retournera toujours un résultat pour maximium. – Mask

+0

Oui, j'ai besoin de plusieurs entrées dans le résultat. – Mask

Répondre

1

Essayez l'instruction SQL suivante:

SELECT id, (
    SELECT text 
    FROM test 
    WHERE test.ID = main.ID 
    ORDER BY created DESC 
    LIMIT 0 , 1 
    ) AS text 

FROM main 

Edit:

Dans le cas où vous avez besoin de plusieurs colonnes de test de la table, vous devez ajouter une clé primaire. Ensuite, dans votre requête, d'abord obtenir la colonne de clé primaire et de l'utiliser comme référence sur les sous-requêtes suivantes:

# Add the primary key 
ALTER TABLE `test` ADD `test_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST ; 

# Select many columns 
SELECT id, (

    SELECT test_id 
    FROM test 
    WHERE test.ID = main.ID 
    ORDER BY created DESC 
    LIMIT 0 , 1 

) AS testID, (

    SELECT text 
    FROM test 
    WHERE test_id = testID 

) AS text, (

    SELECT created 
    FROM test 
    WHERE test_id = testID 

) AS created 

FROM main 
+0

Et si j'ai besoin d'obtenir une valeur créée en même temps? – Mask

+0

Ce sera vraiment lent pour plus d'enregistrements dans la table. –

+0

Non, c'est rapide, si j'ajoute main.id dans (1,2,3), la sous-requête sera lancée 3 fois, c'est acceptable. – Mask

-1
select id, text from main left join test on main.id=test.id order by created 

Vous devrez peut-être utiliser ASC (fin) ou DESC (fin)

+0

Non, je veux seulement sélectionner le texte avec le dernier temps créé. – Mask

+0

dans ce cas, sélectionnez le texte de .... Je mets l'ID parce que vous l'avez fait. :) –

+0

en fait une chose de plus, la limite 1 que Rax mentionné est nécessaire puisque vous voulez juste le dernier (ou est ce que vous vouliez dire par votre commentaire) –

0

ÉDITÉE:

Qu'en est-ce?

select 
    main.id, a1.created,a1.text 
from 
    main 
inner join test a1 on 
    a1.id = main.id 
LEFT OUTER JOIN test a2 ON 
    (a1.id = a2.id 
    AND (a1.created < a2.created)) 
WHERE a2.id IS NULL; 
+0

Pouvez-vous le rendre performant? – Mask

+0

Modifié, cela devrait être plus rapide. Si vous savez que vous n'avez besoin que de quelques enregistrements (main.id) vous pouvez placer où à la première jointure interne, cela peut aider à le rendre encore plus rapide. –

0
SELECT 
     main.id , test.created , test.text 
    FROM 
     main 
     JOIN test ON (main.id = test.id) 
     JOIN (select id,max(created) as created from test group by id) as t2 ON (test.id = t2.id and test.created =t2.created) 
Questions connexes