2012-07-10 74 views
4

我需要提出一個查詢來提取所有用戶的問題,併爲每個問題提供3個來自數據庫的答案。這個查詢需要儘可能高效。在1個單個查詢中獲取問題和答案

我有表:

questions: 
    id 
    user_id 
    title 
    date_created 
    date_updated 

answers: 
    id 
    question_id 
    user_id 
    body 
    date_created 

我能做到在1個單查詢?基本上我需要顯示問題,與用戶表聯繫以獲取用戶名,顯示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 2012-07-10 20:51:37

+0

我試着組連續作出1查詢...因爲我有一個用戶有很多問題和許多答案的問題 – vsergiu 2012-07-10 20:54:43

+0

要求包含用戶名與答案文本使用'CONCAT'有問題。而且,還有一種更自然的方式:可以在查詢中查詢。這仍然會被稱爲「單一查詢」,我預計。 – Smandoli 2012-07-10 20:58:37

回答

0

假設標題是問題,正文是答案,並且對於某些奇怪的原因,問題表中的id字段與答案表中的問題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); 

不過,我會解決的事實,question_id是你的問題的表名爲id,這是非常不好的做法,不給外鍵相同的名稱作爲主鍵它關係到。

+0

那是非常不好的做法?這可能違背了你的組織編碼標準,但從一般觀點來看,這並不是一個壞習慣。當然,並不總是可能有一個FK總是具有相同的名稱,例如在員工表中,您可能想要將員工主管,這是另一個員工ID – Ghost 2012-07-10 21:51:06

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服務器的版本,但這裏是一個示例查詢。
使用,如果你的不能確定外適用,如果問題有答案
使用交叉適用,如果你只想要的答案

問題
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

相關問題