2012-07-10 3 views
4

모든 사용자 질문과 모든 질문에 대해 데이터베이스에서 3 개의 대답을 가져 오는 쿼리를 작성해야합니다. 이 쿼리는 가능한 한 효율적이어야합니다.1 개의 단일 쿼리로 질문과 답변 받기

questions: 
    id 
    user_id 
    title 
    date_created 
    date_updated 

answers: 
    id 
    question_id 
    user_id 
    body 
    date_created 

내가 한 단일 쿼리를 수행 할 수 있습니다

나는 테이블이? 기본적으로 질문을 표시하고, 사용자 테이블과 조인하여 사용자 이름을 얻고, 질문에 대한 3 개의 대답을 표시하고, 각 대답에 대해 포스터의 사용자 이름을 표시해야합니다.

은 내가 DIT는이 같은 것입니다 :

SELECT questions.*, GROUP_CONCAT(answers.id) as answers 
    FROM (questions) 
    JOIN users ON users.id = questions.user_id 
    LEFT JOIN answers ON answers.question_id = questions.id 
WHERE questions.user_id = '1' 
GROUP BY questions.id 
ORDER BY questions.date_updated desc 
LIMIT 3 

하지만이 완성되지도 잘 작동하지 않습니다.

+0

이 방법이
사용 크로스가 적용됩니다 바깥 쪽이 확실하지 않은 경우에 적용 사용 'GROUP_CONCAT'을 피하려면 ...해야합니다. :-) – Smandoli

+0

나는 하나의 쿼리를 만들기 위해 그룹 concat을 시도했다. 왜냐하면 나는 많은 질문과 많은 대답을 가진 질문을 가지고있다. – vsergiu

+0

응답 텍스트에 사용자 이름을 포함시키는 요구 사항은'CONCAT' 문제를 이용한다. 더 자연스러운 방법이 있습니다. 즉, 쿼리 내에서 쿼리 할 수 ​​있습니다. 이것은 여전히 ​​"단일 쿼리"라고 불릴 것입니다. – Smandoli

답변

0

제목이 질문이고 본문이 답변이고, 이상한 이유로 질문 표의 id 필드가 answers 테이블의 question id와 관련되어 있습니다. 세 가지 대답을 제한하기 위해 하위 쿼리를 만들 수 있습니다. 나는 귀하의 질문에 테이블에 ID를 question_id라고 사실을 해결하는 것입니다 그러나

SELECT title, FROM questions 
WHERE user_id IN 
(SELECT users.username, answers.body FROM users, answers WHERE 
answers.user_id = users.user_id LIMIT 3); 

, 그것은 그것과 관련된 기본 키로 외부 키 동일한 이름을 제공하지 아주 나쁜 습관이다.

+0

어떻게 그렇게 나쁜 습관입니까? 표준을 코딩하는 조직에 위배 될 수 있지만 일반적인 관점에서는 나쁜 관행이 아닙니다.항상 FK가 항상 같은 이름을 가질 수있는 것은 아닙니다. 예를 들어 Employee 테이블에서 Employees 수퍼바이저를 추가 할 수 있습니다. 이는 다른 EmployeeID입니다. – Ghost

0

이에 데이터베이스 설계를 변경 시도 할 수 있습니다 :이 디자인 질문에서

post: 
    id 
    parent_id 
    user_id 
    title 
    date_created 
    date_updated 

을에 NULL PARENT_ID 있습니다.

select posts.* from 
(
    SELECT id, parent_id, user_id, title, date_created, date_updated FROM post WHERE id = 67 
    UNION ALL 
    SELECT id, parent_id, NULL as user_id, NULL as title, NULL as date_created, NULL as date_updated FROM post WHERE parent_id = 67 
) posts 
Left JOIN users ON users.id = posts.user_id 
WHERE posts.user_id = '1' 
ORDER BY posts.date_updated desc 
LIMIT 3 

가 데이터베이스에서 데이터를 가져 오는 경우 문제는 첫 번째 위치에 있도록해야합니다 NULL의 PARENT_ID 먼저 확인하십시오 : 지금 당신은이 같은 쿼리를 만들 수 있습니다. 이렇게하면 훨씬 빠르고 관리가 쉽고 가독성이 높아집니다.

1

크로스 적용을 사용하는 것이 좋습니다 ... 사용중인 SQL Server의 버전은 depdens이지만 여기서는 샘플 쿼리입니다. 질문이 답을 가지고있는 경우에만 답변

으로 질문을 원하는 경우
내가 생각하고
SELECT 
    q.id, 
    q.[user_id], 
    q.title, 
    q.date_created, 
    q.date_updated, 
    ans.id, 
    .... 
FROM 
    questions q 
    CROSS APPLY 
    (
    SELECT TOP 3 
     a.id, 
     a.question_id, 
     a.[user_id], 
     a.body, 
     a.date_created 
    FROM 
     answers a 
    WHERE 
     q.id = a.question_id 
    ) ans 

see more here

관련 문제