2009-10-01 2 views
0

설정 :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'); 

사용 :

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); 

반환 :하는 방법을

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

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

? 입력 및 출력 예제를 제공해주십시오. 감사합니다. –

+0

아니요, 제한 1을 사용할 수 없습니다. 이렇게하면 maximium에 대해 항상 하나의 결과 만 반환됩니다. – Mask

+0

예, 결과에 여러 항목이 필요합니다. – Mask

답변

1

는 다음과 같은 SQL 문을보십시오 :

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

FROM main 

편집 : 경우

당신이 테이블 테스트에서 여러 열을 필요로, 기본 키를 추가해야합니다. 그런 다음 쿼리에서 먼저 기본 키 열을 획득하고 다음 하위 쿼리에서 참조로 사용 : 여러 main.id을 의미합니까 무엇

# 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

동시에 생성 된 값을 가져 오려면 어떻게해야합니까? – Mask

+0

테이블의 레코드가 많을수록 속도가 느려집니다. –

+0

아니요, 빨리, main.id를 (1,2,3)에 추가하면 하위 쿼리가 3 번 실행됩니다. 허용됩니다. – Mask

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

당신은 ASC (종료) 또는 DESC를 사용해야 할 수도 있습니다

+0

아니요, 최근에 작성한 시간의 텍스트 만 선택하고 싶습니다. 이 경우 – Mask

+0

에서 텍스트를 선택하십시오. 내가했기 때문에 ID를 넣었습니다. :) –

+0

실제로 한가지 더, 렉스가 언급 한 한계 1은 최신을 원하기 때문에 필요합니다. (또는 귀하의 의견으로는 그게 무엇입니까?) –

0

편집 (종료) : 어떤이에 대한

를?

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

성과가 좋습니까? – Mask

+0

수정되었습니다. 더 빨라야합니다. 단지 몇 개의 레코드 (main.id) 만 필요하다면 첫 번째 내부 조인을 배치 할 수 있습니다. 더 빨리 수행하는 데 도움이 될 수 있습니다. –

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) 
관련 문제