2014-01-06 7 views
1

에서 얻는 데이터를 I가 데이터베이스에 다음과 같은 테이블 :MySQL은 쿼리를 조인 왼쪽 - 세 개의 테이블

post :

+---------------+----------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+---------------+----------------+------+-----+---------+----------------+ 
| post_id  | int(11)  | NO | PRI | NULL | auto_increment | 
| post_content | varchar(50000) | NO |  | NULL |    | 
| post_date  | datetime  | NO |  | NULL |    | 
| post_summary | varchar(1000) | YES |  | NULL |    | 
| post_title | varchar(300) | NO |  | NULL |    | 
| post_visitors | int(11)  | NO |  | NULL |    | 
| user_id  | int(11)  | NO | MUL | NULL |    | 
| category_id | int(11)  | NO | MUL | NULL |    | 
+---------------+----------------+------+-----+---------+----------------+ 

user :

+---------------+--------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+---------------+--------------+------+-----+---------+----------------+ 
| user_id  | int(11)  | NO | PRI | NULL | auto_increment | 
| user_image | varchar(500) | YES |  | NULL |    | 
| user_name  | varchar(45) | NO |  | NULL |    | 
| user_password | varchar(45) | NO |  | NULL |    | 
| user_type  | varchar(30) | NO |  | NULL |    | 
| user_username | varchar(45) | NO |  | NULL |    | 
+---------------+--------------+------+-----+---------+----------------+ 

comment :

+-----------------+--------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+-----------------+--------------+------+-----+---------+----------------+ 
| comment_id  | int(11)  | NO | PRI | NULL | auto_increment | 
| comment_content | varchar(600) | NO |  | NULL |    | 
| comment_date | datetime  | NO |  | NULL |    | 
| comment_title | varchar(300) | NO |  | NULL |    | 
| user_id   | int(11)  | NO | MUL | NULL |    | 
| post_id   | int(11)  | NO | MUL | NULL |    | 
+-----------------+--------------+------+-----+---------+----------------+ 

내가 반환하는 쿼리를 필요 post_title, post_summary, post_date, number_of_comments_for_this_post (내림차순)으로 정렬 number_of_comments_for_this_post, user_name.

기본적으로 세 테이블의 데이터가 필요합니다. 나는 두 테이블을 결합하고 데이터를 얻는 방법을 안다. 예를 들어 :

SELECT p.post_title, p.post_summary, p.post_date, u.user_name 
FROM post p LEFT JOIN user u ON p.user_id=u.user_id; 

어떻게 세 번째 테이블 (코멘트)와 또 하나 개의 필드를 추가 가입하여이 쿼리를 확장하는 - '게시물의 수를 주석의 가장 처음 (내림차순) 게시물을 주석으로 정렬?

답변

2

같은

select p.post_title, p.post_summary, p.post_date, u.user_name 
from post p 
left join user u 
USING(user_id) 
left join comment c 
USING(post_id) 
-1

쉬운, 그냥 유용한 작은 도우미 외에 일반 구문

select p.post_title, p.post_summary, p.post_date, u.user_name 
from post p 
left join user u 
on p.user_id = u.user_id 
left join comment c 
on p.post_id = c.post_id 

계속 :

당신은()에 가입하기 위해 두 테이블의 열을 사용하여 동일한 이름을 사용하는이 상황이있는 경우 mysql jedi를 더 쉽게 사용하십시오! 이

SELECT 
    p.post_id, 
    p.post_date, 
    p.post_summary, 
    p.post_title, 
    u.user_name, 
    COUNT(c.comment_id) AS number_of_post_comments 
FROM 
    post p 
    LEFT JOIN COMMENT c 
    ON p.post_id = c.post_id 
    LEFT JOIN USER u 
    ON p.user_id = u.user_id 
GROUP BY p.post_id 
ORDER BY number_of_post_comments DESC 
+0

파다완에서는 USING()을 사용하지 마십시오. 더 큰 쿼리에서는 너무 혼란 스럽습니다. 성능 이점이 없습니다. – Strawberry

+0

이것은 성능 이점이 아니라 단점도 아닙니다. 그리고 그것의 적은 코드는 사용자 u와 u.x = c.y와 같은 테이블 접두사를 읽음으로써 두통을 겪습니다. 나는 이것이 전혀 혼란스럽지 않다고 생각하지만 이것은 맛의 문제입니다! 어쨌든 큰 쿼리는 읽기 어렵습니다. USING() 또는 ON 문이 중요하지 않습니다. 새 줄을 사용하여 쿼리를 형식화하면 읽을 수있는 작업이 절반으로 줄어 듭니다. – Steini

+0

@Steini 결과에 number_of_posts 주석 필드를 포함하지 않았고 해당 필드로 정렬하면 – Vladimir

1

뭔가 그냥 relational algebra 연산자에 가입하세요. 관계 대수학은 또 다른 쿼리 형식입니다. 테이블은 관계이고, 그것들에 대한 연산은 다른 관계를 생성합니다. 여러 작업을 사용하여 결과 관계를 생성 할 수 있습니다. MySQL JOIN 매뉴얼 페이지에도 나와 있습니다.

행 집합에 대해 일부 통계를 계산하려면 aggregate functions이 필요합니다. 이 경우 COUNT이 필요합니다.

SELECT 
    post_title, 
    post_summary, 
    post_date, 
    COUNT(comment_id) AS comment_cnt, 
    user.user_name 
FROM 
    post 
    LEFT JOIN user USING(user_id) 
    LEFT JOIN comment USING(post_id) 
GROUP BY 
    post_id 
ORDER BY 
    comment_cnt DESC 
+0

이 쿼리가 유효한 결과를 반환하지 않습니다 – Vladimir

+0

어떤 종류의 오류가 있습니까? – StarsSky

+0

'post' 테이블 내용, 쿼리 및 결과를 텍스트 파일에 넣었습니까? http://ge.tt/71ld1cC1/v/0?c – Vladimir