2010-08-04 6 views
1

숨겨진 페이지 (visible = "n")를 제외하고 최근 updated (필드) pages (테이블)을 선택하려고합니다. 그러나 나는 페이지를 slug으로 그룹화하고 싶기 때문에 슬러그 당 하나의 결과 만 얻습니다.SQL LEFT JOIN 문제

다음 쿼리는 작동하지만 모든 슬러그에 대해 최신 업데이트 된 페이지 만 선택합니다. 페이지가 숨겨져 있으면 결과에서 제거됩니다. (이 경우에는 이 '보이지 않는 한 표시 것을 그 슬러그와 최신 업데이트 된 페이지입니다.

SELECT `p1`.`id` AS `pID`, `p1`.`slug` AS `url`, `p1`.`revision`, `p1`.`title`, `p1`.`published`, `p1`.`updated`, (SELECT COUNT(*) FROM `pages` WHERE `slug` = `url` AND `visible` = "y") AS `revisionCount`, (SELECT COUNT(*) FROM `tests` WHERE `pageID` = `pID`) AS `testCount` 
FROM `pages` `p1` 
LEFT JOIN `pages` `p2` ON `p1`.`slug` = `p2`.`slug` AND `p1`.`updated` < `p2`.`updated` 
WHERE `p2`.`updated` IS NULL AND `p1`.`visible` = "y" 
ORDER BY `p1`.`updated` DESC 
+0

각 슬러그에 대해 최신의 업데이트되고 표시되는 페이지를 원하십니까? 업데이트 된 날짜 또는 int 같아요? – MrSoundless

+0

@MrSoundless : 업데이트 된 날짜입니다. – naburi

답변

1

이 작동합니다 :

SELECT id AS pID, slug AS url, revision, title, published, updated, (SELECT COUNT(*) FROM pages WHERE slug = url AND visible = "y") AS revisionCount, (SELECT COUNT(*) FROM tests WHERE pageID = pID) AS testCount 
FROM pages 
WHERE updated IN (SELECT MAX(updated) FROM pages WHERE visible = "y" GROUP BY slug) AND visible = "y" 
ORDER BY updated DESC 

P.S.을 모든 backticks는 무엇입니까?

2

이 GROUP BY의 고전적인 사례이다는. 때문에 귀하의 경우에 당신도 간주 페이지 를 원하지 않는다 '라고하면 HAVING 절이 아닌 WHERE 절을 사용하게됩니다.

SELECT MAX(id) as highest_id_for_slug, slug 
FROM pages 
GROUP BY slug 
WHERE visible = 'y' 

이러한 ID를 페이지 테이블에 추가하려는 경우 하위 쿼리에서 사용하거나 필드를 추가 할 수 있습니다. SELECT 목록의 모든 열이 GROUP BY에 있어야한다는 규칙을 기억하고, 또는 집계가 적용되어 있어야합니다.

SELECT * FROM pages WHERE pages.id IN (
    SELECT MAX(id) as highest_id_for_slug 
    FROM pages 
    GROUP BY slug 
    WHERE visible = 'y' 
)