2009-08-25 6 views
2

이 같은 두 개의 테이블이와 한계에 가입 -> 나는이 같은 쿼리 결과 원하는MySQL은 두 개의 테이블

Categories 
----------- 
id  name 
--------- 
1 -->  a 
2 --> b 
3 --> c 



    Messages 
    ------------ 
    id  catid message 
    --------------------------- 
    1 -->  1 -->  aa 
    2  --> 1 -->  bb 
    3  --> 1 -->  cc 
    4  --> 2 -->  dd 
    5  --> 3 --> ee 
    6  --> 3 --> ff 

    i want to join the tables for get FIRST message from messages table, 

- 내가 코드를 발견>

------------------------------- 
id   name  message 
1   a   aa 
2   b   dd 
3   c   ee 

select * from categories c, items i 
    -> where i.categoryid = c.id 
    -> group by c.id; 

하지만 ORDER BY 절차는 없습니다.

답변

1
SELECT c.*, i.* 
FROM categories c 
JOIN items i ON (i.categoryid = c.id) 
LEFT OUTER JOIN items i2 ON (i2.categoryid = c.id 
    AND (i.message > i2.message OR i.message = i2.message AND i.id > i2.id)) 
WHERE i2.categoryid IS NULL 
ORDER BY c.id; 

이것은 MySQL이 GROUP BY 쿼리에서 너무 나쁘기 때문에 MySQL에서 더 잘 수행되는 경향이 있습니다.

0

MySql은 첫 번째 레코드를 기준으로 그룹화하면 항상 두 번째 테이블의 첫 번째 레코드를 반환합니다.

SELECT a.id, a.name, b.message FROM Categories a, Messages b WHERE b.catid = a.id GROUP BY a.id ORDER BY a.id 
+0

이것은 MySQL의 문서화 된 정책이 아니며 현재 버전에서는 사실 일 수 있습니다. 모든 스토리지 엔진 또는 향후 버전에서이 사실에 의존하지 않는 것이 좋습니다. –

+0

실제로, 데이터베이스 내보내기/가져 오기의 일부 종류를 통해. 당신이 정직하게 메시지 aa, bb 또는 cc를 얻는 지 상관하지 않는다면이 쿼리로 도망 갈 수 있습니다. 그러나 ANSI 호환 DBMS는 여전히 불평 할 것입니다. – bobince

관련 문제