2008-11-13 2 views
1

다소 단순한 SQL을 작성해야하지만 요즘 DB를 사용하는 드문 사건으로 세부 사항을 파악할 수 없습니다. 다음 열SQL : 모든 의견이있는 모든 게시물 얻기

ID, 캡션, 텍스트

및 테이블 '의견':

나는 다음과 같은 열이있는 테이블 '게시물'이 ID, 이름, 텍스트, Post_id

그 (단일) SQL 문은 'post_id'키를 통해 하나 이상의 주석이 연결된 모든 게시물의 캡션을 검색하는 것처럼 보입니까? DBMS는 SQL 쿼리와 관련이있는 경우 MySQL입니다.

답변

7
select p.caption, count(c.id) 
from posts p join comments c on p.id = c.post_id 
group by p.caption 
having count (c.id) > 0
+0

HAVING 및 COUNT는 1 개 이상의 댓글이있는 항목을 원하므로 불편합니다. 내부 조인이 기본 임에도 불구하고 INNER JOIN을 사용하여 명확하게 나타냅니다. – jishi

+0

및 GROUP BY p.id를 사용하는 것이 좋습니다. – jishi

+0

"...> 1"이 아닌 "...> 0"이어야합니다. 좋은 것으로 보이는 것 외에도 :) –

-2

당신은 기본적으로 하위 쿼리를 수행하는보고있는 -

SELECT p.caption FROM posts p WHERE (SELECT COUNT(*) FROM comments c WHERE c.post_id=p.id) > 1;

는이 게시물 테이블의 각 행에 대해 SELECT COUNT(*) 하위 쿼리를 실행하는 효과가 있습니다. 당신의 테이블의 크기에 따라 comments, 그런 당신이 간단하게 할 수있는

+0

아니요! 탈종은 이처럼 단순한 것에 결코 옹호되어서는 안됩니다. – FlySwat

-1

SELECT p.caption FROM posts p WHERE comment_count > 1 그냥 꺼져가는 상단의 해당 번호를 저장하기 위해 posts 테이블에 추가 열, comment_count를 추가하는 것이 좋습니다 여기하지만 어쩌면 내 머리의 무엇인가 :

SELECT caption FROM posts WHERE id IN (SELECT post_id FROM comments HAVING count(*) > 0) 
2
SELECT DISTINCT p.caption, p.id 
    FROM posts p, 
     comments c 
    WHERE c.post_ID = p.ID 

나는 하시다 조인을 사용하여 생각 uld는 IN 절이나 하위 쿼리를 사용하는 것보다 훨씬 빠릅니다.

+0

하지만 당신이 더 낫습니다. – jishi

+0

DISTINCT가 여기에서 작동하는지 확실하지 않거나 하위 쿼리에 중첩해야하는 경우 (예 : DISTINCT 캡션 FROM (내 쿼리)) ... 그러나 나는 그것을 밖으로 던질 것이라고 생각했습니다. – FlySwat

+0

캡션과 p.id가 각 게시물에 대해 동일 할 것이기 때문에 distinct가 여기에서 작동한다고 저는 믿습니다. – jishi

0

게시물 캡션에서 선택 INNER JOIN 덧글 ON comments.post_id = posts.id GROUP BY posts.id;

having 절 또는 count()가 필요하지 않습니다.

편집 : jishi 덕분에 물론 내부 조인이어야합니다 (댓글이 고아 인 경우 null을 피하기 위해).

+0

그 사람이 고아가 된 댓글에 대해 널 게시물을주지 않는다는 것은 나쁜 생각이다. 왼쪽 조인은 주석에 널을 제공합니다. 내부 조인은 갈 길입니다. – jishi

0
SELECT DISTINCT caption 
FROM posts 
    INNER JOIN comments ON posts.id = comments.post_id 

카운트 및 하위 쿼리는 잊어 버리십시오.

내부 조인은 유효한 게시물이있는 모든 댓글을 선택하고 0 개의 댓글이있는 모든 게시물을 제외합니다. DISTINCT는 하나 이상의 주석이있는 게시물의 중복 된 캡션 항목을 병합합니다.

+0

MySQL은 추론 된 내부 조인 구문을 가지고 있지 않습니다. (내 게시물은 T-SQL입니다.) – FlySwat

0

나는이 상황에서 가장 읽을 수이 구문 찾기 :

SELECT * FROM posts P 
    WHERE EXISTS (SELECT * FROM Comments WHERE post_id = P.id) 

그것은이 글의 다른 대부분의 것보다 당신의 의도가 잘 표현 - "나에게 모든 게시물을 줄을 ..."(선택 * from posts) "... 의견이 있습니다"(어디에서 (* select * from comments ...)).기본적으로 위의 조인과 동일하지만 실제로 조인을하지 않기 때문에 게시물의 레코드 중복에 대해 걱정할 필요가 없으므로 게시물 당 하나의 레코드 만 얻을 수 있습니다.

+0

가장 느린 쿼리도 아직 게시했습니다. =) – FlySwat

+0

흠 ... DB 엔진에 의존한다고 생각합니다. 쿼리는 * 본질적으로 * 느리지 않습니다. 왜냐하면 그것은 조인과 관계가 있기 때문입니다. 좋은 옵티마이 저는이를 조인만큼 빠르게 실행해야합니다. 그렇지 않으면 고유 한 조인 결과가 구체화되는 것을 피할 수 있다면 빠릅니다. 물론, 나는 그것을 테스트하지 않았다. :) –

관련 문제