2011-10-06 4 views
2

저는 MySQL에 비교적 익숙하지 않아이 섹션으로 인해 어려움을 겪고 있습니다.MySQL Join 너무 많은 행을 반환합니다.

나는 블로그와 관련된 코멘트와 함께 블로그를 보여줄 간단한 블로그 페이지를 만들고있다. 나는 현재이 데이터를 처리 할 수있는 두 개의 테이블이 있습니다

블로그

.blog_id (primary), .blog_title, .blog_date, .blog_post 

댓글을

.comment_id (primary), .blog_id, .comment_name, .comment 

내가 묶여 의견을 ID를 일치하는 특정 블로그를 끌어 당겨하면된다하려고 그 블로그에. 여기 내 쿼리입니다 : 올바른 정보를 당기에

SELECT * FROM blogs JOIN comments ON blogs.blog_id=comments.blog_id WHERE blogs.blog_id = $active ORDER BY comments.comment_id 

이 쿼리 결과지만 블로그에 두 의견이있는 경우는 코멘트를 통해 반복 것, 그것은 두 번 블로그 모든 것을 표시합니다. 모든 블로그 정보를 한 번 표시 한 다음 댓글을 반복합니다.

나는 이것을 분명히 설명하기를 희망한다. 어떤 도움이라도 환상적입니다. 고맙습니다.

+0

글쎄 - 그냥 현재 블로그의 ID를 저장하고 다음 반복에서 확인하십시오. 동일하면 - 출력하지 마십시오 – zerkms

+0

쿼리를 두 단계로 나누는 것은 어떻습니까? 처음에는 블로그 데이터를 가져오고 두 번째 블로그에는 해당 블로그의 모든 댓글이 표시됩니다. –

+0

나는 하나의 쿼리에서이 작업을 수행하는 것이 이상적입니다. 하위 ... er..nested 쿼리를 생성 할 수 있습니까? 그렇다면 여기 어떻게 사용할 수 있습니까? – Yuschick

답변

3

설명하는 동작은 조인이 수행해야하는 동작입니다. 블로그 항목 각각에 대해 1 개의 레코드 만 원한다면 group by를 사용해야합니다. 의견의 수에 모든 블로그 기록의 목록을 얻으려면 같은 쿼리를 수행 할 수 있습니다

SELECT blogs.*,Count(comments.comment_ID) 
FROM blogs 
LEFT JOIN comments 
ON blogs.blog_id=comments.blog_id WHERE blogs.blog_id = $active 
ORDER BY comments.comment_id 
GROUP By Blog.BlogID 

그러나, 당신은 그럼 그냥 블로그, 그리고 블로그와 관련된 의견을 표시하고 싶어했다. 이 경우 대부분의 경우 초기 쿼리를 사용하여 모든 블로그를 가져온 다음 모든 블로그 항목을 반복하면서 각 블로그에 대한 설명을 얻습니다. 다음은 몇 가지 의사 코드입니다.

select * FROM blogs 

For each record from above 
    Code for displaying blog goes here 

    Select * FROM Comments where Blog_id = $blogID 

    For each comment from above query 
     code for displaying comment goes here 

    Next COmment 

Next Blog 

당신은보다 효율적으로 할 수있는 모든 의견에 대해 하나의 선택을 할 수 있지만, 결과 목록에서 PHP를 사용하여 레코드를 찾아야로 결과 코드를 더 복잡하게 할 수있다. 단순히 여러 개의 쿼리를 사용하는 것이 더 간단하고 대부분의 블로그 (한 페이지에 최대 10 개의 기사)만큼 큰 차이는 없습니다. 단일 쿼리를 실제로 사용하려면 아래의 의사 코드와 같이 프로그램을 구조화 할 수 있습니다.

SELECT * FROM blogs 
LEFT JOIN comments ON blogs.blog_id=comments.blog_id 
WHERE blogs.blog_id = $active ORDER BY blogs.blog_id, comments.comment_id 

$LastBlogID = -1 

FOR EACH Record 
    If $LastBlogID != record['blog_id'] 
     Display Blog Information 
     $LastBlogID = record['blog_id'] 
    End If 

    Display Comment Information 
Next Record 
+0

10 개 항목에 대해 1 또는 2 대신 11 개의 쿼리가 ** ** 많은 차이가 있습니다. – zerkms

+0

11은 2보다 크지 만 실행 시간면에서 눈에 띄지 않습니다. – Kibbee

+0

참으로 그것은 일일 방문자 10 명을위한 것이 아닙니다. – zerkms

0

이 접근 할 수있는 두 가지 방법이 있습니다, 당신의 합류 SQL을 사용하고 고유 키로 블로그의 ID를 사용하여 결과를 반복 당신이 절대적으로 한 쿼리에서이 작업을 수행해야하는 경우

을 :

$blogId = 0; 
while (null != ($row = mysql_fetch_assoc($result))) 
{ 
    if ($row['blog_id'] != $blogId) 
    { 
    // Display blog contents here 
    $blogId = $row['blog_id']; 
    } 
    // Print coment 
} 

더 효율적인 방법은 두 개의 쿼리로 실행하는 것입니다.

SELECT blog_id, blog_title, blog_date, 
    (SELECT COUNT(*) FROM comments WHERE blog_id = blog.blog_id) as comment_count 
FROM blogs 
WHERE blog_id = $blogId 
  • 만 COMMENT_COUNT가 0보다 greather 경우, 별도의 주석을 선택하고 디스플레이 : 하위를 선택하여,

    SELECT blog_id, blog_title, blog_date, blog_post, COUNT(*) as comment_count 
    FROM blogs INNER JOIN comments ON blogs.blog_id = comments.blog_id 
    WHERE blog_id = $blogId 
    GROUP BY blog_id, blog_title, blog_date, blog_post; 
    

    또는 첫째 게시물의 수와, 블로그 정보를 선택 .

블로그보기에는 여러 가지가 있습니다. 색인 페이지에서 두 번째 쿼리는 각 의견의 내용을 표시 할 필요없이 블로그 요약과 각 게시물에 대한 의견 수를 가져 오는 데 필요한 모든 것입니다.

0

살펴볼 부분이 두 개 있는데, 하나는 쿼리이고 다른 하나는 사용자가 표시하는 방법입니다.

방금 ​​MYSQL 쿼리를 작성하고 사용자 쿼리를 분석하는 간단한 도구를 발견했습니다. 데이터베이스를 웹 사이트와 연결할 수도 있습니다.

Google 크롬 시장에서 검색하거나 아래 링크를 통해 이동할 수 있습니다.

나는 실제로 그것을 해결하기보다는 제안과 방향을 제시 할뿐입니다.

MYSQL query builder

관련 문제