2009-09-15 2 views
1

2 개의 테이블이 있습니다. 하나는 항목이고 다른 하나는 해당 항목에 대한 투표입니다. 내가 원하는 무엇mysql : 테이블을 INNER JOIN하는 방법이 가장 많은 투표 또는 개수로 1 개의 결과로 조인을 제한 하시겠습니까?

Items table has: |item_id|name|post_date 
Votes table has: |votes_id|item_id|answer|total_yes|total_no 

는 POST_DATE에 따라 모든 항목을 보여 가장 높은 total_yes로 투표 테이블에서 답을 표시입니다. 그래서 저는 가장 큰 total_yes 투표를 가진 투표 표에서 단 하나의 대답만을 보여주고 싶습니다.

SELECT a.*, b.* FROM Items a 
INNER JOIN Votes b ON a.item_id = b.item_id 
GROUP by a.item_id 
ORDER by a.post_date DESC, b.total_yes DESC 

을하지만 그 나던 작업 :

나는 노력했다. 내가보고 싶은

결과는 다음과 같습니다

<item><answer><yes votes> 
Buick | Fastest | 2 yes votes 
Mercedes | Shiny | 32 yes votes 
Honda | Quick | 39 yes votes 

어떤 도움에 감사드립니다!

+0

najmeddine의 대답은 아주 가깝습니다. 그러나 문제는 항목에 투표가 없으면 표시되지 않는 것입니다. 내가하고 싶은 일은 모든 항목을 표시하는 것입니다 (투표 테이블에 투표가 없더라도). –

답변

8
SELECT a.*, b.* 
    FROM Items a 
     LEFT JOIN Votes b on a.item_id = b.item_id 
         and b.total_yes = (select max(total_yes) 
               from Votes v 
         where v.item_id = a.item_id) 
ORDER BY a.post_date DESC, b.total_yes DESC 

N.B .: 동일한 total_yes = max 인 항목 2 개의 답변이있는 경우 해당 항목에 2 행이 있습니다.

+0

굉장! 정말 고마워! –

+0

한 가지 문제 ... 표 Votes에 일치하는 item_id가 없으면 해당 항목이 표시되지 않습니다. 어쨌든 조인이 없으면 항목을 표시합니다. –

+0

그냥 LEFT JOIN이 필요합니다. 끝난. – manji

0

은 하나 개의 레코드를 취할 것입니다 검색 결과 : 끝으로 LIMIT 1을 추가 할 수 있지만 마지막 날짜에 대한 가장 높은 표를 얻을 것이다, 그래서 그 순간에 당신은, 먼저 날짜별로 주문하고 에 투표했다. 너가 원하는게 그거야?

우선 총 투표 수를 늘리려면 먼저 그 투표를해야합니다.

+0

나는 실제로 많은 결과를 보여주고 싶다. 그리고 각각의 결과는 가장 높은 표를 나타낼 것입니다. 쿼리를 통한 루프입니다. 감사! –

+0

Scott, 루프 내부에 쿼리를 넣지 않기를 바랍니다. 루프를 수행하지 않고도 필요한 모든 결과를 검색 할 수 있도록 쿼리를 작성하는 방법이 있어야합니다. 루프를 사용하면 동기화 문제가 발생하고 문제가 발생할 수 있습니다. – Fragsworth

관련 문제