2010-02-06 4 views
5

MYSQL5 데이터베이스와 PHP 5가 있습니다. 각 게임 카테고리의 처음 12 개만 선택하는 게임 웹 사이트 색인 페이지에 대한 쿼리가 필요합니다. 여기까지 내가 지금까지 가지고있는 것이있다.고급 SQL 쿼리입니다. 각 카테고리의 상위 12 개 (MYSQL)

$db->query("SELECT * FROM `games` WHERE status = 'game_published' AND `featured` = '1' ORDER BY `category`"); 

PHP 코드는 같은 카테고리의 게임을 함께 그룹화하고 표시합니다. 하지만 네가 원하는대로 각 카테고리의 게임 수를 제한하지 않습니다. i49.tinypic.com/aysoll.png 여기

은 내가 뭘하려고 오전 같은 소리 블로그 게시물입니다 : http://www.e-nformation.net/content/view/title/MySQL+Top+N+in+each+group+(group+inner+limit)을하지만 난 못해 여기

은 같은 테이블의 구조가 어떻게 생겼는지 정확히 그것을 이해하십시오.

도움을 주시면 감사하겠습니다.

답변

1

어때?

SELECT * FROM (
    SELECT 
     games.*, 
     @rn := CASE WHEN @category=category THEN @rn + 1 ELSE 1 END AS rn, 
     @category := category 
    FROM games, (SELECT @rn := 0, @category := NULL) AS vars 
    WHERE status = 'game_published' AND featured = '1' 
    ORDER BY category 
) AS T1 
WHERE rn <= 12 
+0

다른 솔루션도 사용할 수 있지만 이것이 최선이라고 생각합니다. 감사. – Neddy

0

언급 한 게시물의 기술을 사용하려면 게임을 주문할 방법이 필요합니다. 그들은 기사 날짜를 사용하고 있습니다. 그런 다음 해당 회사의 이전 기사 수를 선택하고 3 개를 초과 할 수 없다고 말합니다.

게임 테이블이 id라는 자동 증가 열이있는 경우, 당신은 같은 카테고리 별 상위 10 개 게임을 선택할 수 있습니다

SELECT * 
FROM  games g1 
WHERE status = 'game_published' 
     AND featured = '1' 
     AND 10 > 
     (
     SELECT COUNT(*) 
     FROM  games g2 
     WHERE g2.status = 'game_published' 
        AND g2.featured = '1' 
        AND g1.category = g2.category 
        AND g2.id > g1.id 
     ) 

where 조건에 10 개 이상의 행이있을 수 없다는 같은 카테고리와 높은 ID.

+0

아 ^^ 잘 사용 이 여기에 아마도 가장 유용한 자원이다. 그것은 더 우아 할 것입니다 - 그러나 어쩌면 좀 더 정신을 휘게하는 - 그것을하는 방법. –

0

더 멋진 해결책이있을 수 있지만 각 카테고리에 대해 쿼리를 실행할 수 있습니다.

SELECT DISTINCT(category) FROM `games`; 

그런 다음 12 행에 대한 결과 및 쿼리의 각을 : 첫 번째 범주의 목록을 얻을

물론
SELECT * FROM games WHERE status = 'game_published' 
AND `featured` = '1' AND `category` = $category LIMIT 12; 

당신이 (그것에 의해 순서) 일부 행을 순위의 종류를 추가 할 필요를 상단 (12)

를 얻을 :이 단일 쿼리와 함께 할 수있는 방법이 될,하지만 그것은 순간에 저를 탈출 할 수 있습니다.

1

우리는 종류의 약 만 이야기하지 않는 경우, UNION를 사용할 수 ...

pseudoSQL :

(SELECT * FROM table WHERE condition AND category = 'action' ORDER BY id LIMIT 10) 
UNION 
(SELECT * FROM table WHERE condition AND category = 'action' ORDER BY id LIMIT 10) 
UNION 
(SELECT * FROM table WHERE condition AND category = 'action' ORDER BY id LIMIT 10) 

당신이 당신의 PHP에서 카테고리의 배열이있는 경우/ASP, 당신 즉석에서이 조합을 생성 할 수 있습니다.

더 : http://dev.mysql.com/doc/refman/5.0/en/union.html

편집 : http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

기사의 링크를 따르지 않았고,