2011-03-06 3 views
1

저는 현재 뉴스 데이터베이스 웹 사이트에서 일하고 있으며 가장 인기있는 5 가지 뉴스 기사를 선택하는 쿼리를 만들 수없는 것 같습니다. 이 쿼리에 대한 영향을받는 데이터베이스의 두 테이블은 다음과 같습니다다소 복잡한 mysql 쿼리

  • 뉴스 - 모든 뉴스 항목을 포함하는 (등 아이디, 저자, 메시지)
  • 요금 - 모든 뉴스 항목에 대한 등급 (ID 포함

지금 내 쿼리가 5 가장 높은 평균 평가와 테이블 요금에서 news_ids하고 가장 많은 표를 선택해야 news_id, 평가 등) 및 COUNT (*) 나는 가정) (그래서 AVG (평가에 의해 주문). 나는 처음에 내 쿼리를 만들려고했는데, 뉴스 테이블에서이 news_ids의 모든 정보를 즉시 (WHERE id IN (- 가장 인기있는 5 개의 news_ids를 선택하는 쿼리)를 사용하여) 가져 왔지만 MySql 버전의 오류를 반환했습니다. WHERE IN 절 하위 쿼리 내부에서 LIMIT를 사용할 수 없습니다.

음, 5 가지 news_ids를 선택해야하는 첫 번째 쿼리에서 나를 도울 수 있기를 바랍니다. 내가 지금 같이있어 쿼리는 (그러나 완전하게 작동하지 않는)입니다 :

SELECT news_id FROM 
       (SELECT news_id, AVG(rating) AS average_r, COUNT(*) AS amt_r 
         FROM rates 
         GROUP BY news_id 
         ORDER BY average_r,amt_r 
         DESC LIMIT 5 
       ) AS news_rates 

또는 내 스크립트의 나머지 부분과 내용의

:

SELECT TOP 5 N.id, N.author, N.message, AVG(R.rating) AS rate, COUNT(R.news_id) AS votes 
FROM  news N 
INNER JOIN rates R ON N.id = R.news_id 
GROUP BY N.id, N.author, N.message 
ORDER BY rate, votes 

답변

2

average_r과 amt_r이 모두 내림차순입니까?

SELECT news_id FROM 
       (SELECT news_id, AVG(rating) AS average_r, COUNT(*) AS amt_r 
         FROM rates 
         GROUP BY news_id 
         ORDER BY average_r DESC, amt_r DESC 
         LIMIT 5 
       ) AS news_rates 
+0

방금 ​​해결했습니다! 그런 어리석은 실수, 고마워, 지금 일하고있어 :). – Skyfe

0

이 시도 을 대신 사용하여을 입력하면 limit :

SELECT * 
FROM news n JOIN (
    SELECT news_id, AVG(rating) AS average_r, COUNT(*) AS amt_r 
    FROM rates 
    GROUP BY news_id 
    ORDER BY average_r,amt_r DESC 
    LIMIT 5 
) top5 ON n.news_id = top5.news_id 
ORDER BY top5.average_r,top5.amt_r 

참고 : 대신 정격 가장 낮은의, 가장 높은 평가 항목을 얻을 수있는 ORDER BY average_r DESC, amt_r DESC에 쿼리를 변경할 수 있습니다.

+0

MySql은 'TOP n' 절을 지원하지 않습니다. –

+0

이것은 MS-SQL처럼 보입니다. mysql에 "SELECT TOP"이 있다고 생각하지 않습니다. –

+0

응답 해 주셔서 감사합니다. 네가 제공 한 MySql 쿼리는 나에게 mysql_error를 준다 : 당신은 SQL 구문에 오류가있다; N.aut, N.message, AVG (R.rating) AS 속도, COUNT (R.news_id) AS 투표 F '근처에서 사용할 올바른 구문에 대해서는 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. 1 호선에서. – Skyfe

0

당신을 :

$get_hot_news_ids = mysql_query("SELECT news_id FROM 
     (SELECT news_id, AVG(rating) AS average_r, COUNT(*) AS amt_r 
     FROM rates 
     GROUP BY news_id 
     ORDER BY average_r,amt_r DESC LIMIT 5) AS news_rates"); 

    $first = 1; 
    while($news_id  = mysql_fetch_assoc($get_hot_news_ids)) { 
     if(!$first) { 
      $hot_news_ids .= " ,"; 
     }else{ 
      $first = 0; 
     } 
     $hot_news_ids .= $news_id['news_id']; 
    } 
    //print_r($hot_news_ids); 
    $get_hot_news = mysql_query("SELECT * FROM news 
     WHERE id IN($hot_news_ids) 
     ORDER BY FIELD(id, $hot_news_ids)"); 
+0

대단히 고맙습니다. 그러나 PPC-Coder는 이미 기본 솔루션을 제공해주었습니다. 설명과 대체 쿼리를 사용하여 주시면 감사하겠습니다. – Skyfe