2014-02-19 72 views
1

所以......我的右連接不起作用。這聽起來很模糊,而且所有的事情都考慮到了,它可能實際上是有效的。但是,對於我的生活,我無法弄清楚發生了什麼事情!爲了簡單起見,這是我的查詢。我明白它有點本地化,但它非常簡單。正確加入不加入?

SELECT a.answer, a.element_id, e.element_type, e.question, e.description 
FROM cal_form_answers a 
RIGHT JOIN cal_form_elements e 
    USING(element_id) 
INNER JOIN cal_forms f 
    USING(form_id) 
WHERE f.org_id = ? 
    AND e.form_id = ? 
    AND 
    (
     a.member_id = ? 
     OR a.member_id IS NULL 
    ) 
GROUP BY a.element_id 
ORDER BY e.order 

問題是,這只是返回cal_form_elements中具有相應cal_form_answer。但是,因爲我使用的是正確的連接,不應該也包含這樣的元素嗎不是有相應的答案嗎?或者我誤解了完全的聯結?

謝謝!

編輯:這是一個例子小提琴。 http://sqlfiddle.com/#!2/a8d99/1

+0

您可以發佈每個表格的一小行樣本,或者甚至更好,在http://sqlfiddle.com上設置演示? –

+0

爲什麼結果不包含元素4和5? http://sqlfiddle.com/#!2/a8d99/1 – Nathanael

+0

啊,因爲你有'element_id = 5'的多個值,其他的'member_id'具有不同的值。所以從來沒有'element_id = 5'和'member_id IS NULL'的情況,因爲有'member_id = 30001'的情況。如果我有機會,我會盡力找出答案.. –

回答

1

因爲你cal_form_answers表包括與cal_form_elements多個可能的關係,你的企圖OR member_id IS NULL不能成功,如果其他member_id <> 30000在表中存在。

取而代之,您可以將member_id值條件轉換爲的加入條件。你也有一個GROUP BY,這是不適合的,因爲你沒有聚合函數(MIN(),MAX(),COUNT(),SUM(),etct)。 MySQL允許它,但行爲可能有些不確定。

我用LEFT JOIN而不是RIGHT JOIN如果沒有理由,我覺得它們更直觀。結果是一樣的。

SELECT 
    /* Changed some of the table sources for common columns here... */ 
    a.answer, 
    e.element_id, 
    e.element_type, 
    e.question, 
    e.description 
FROM 
    cal_form_elements e 
    /* Perform a LEFT JOIN on element_id and require member_id = 30000 */ 
    /* if this isn't met, cal_form_elements will still return */ 
    LEFT JOIN cal_form_answers a ON e.element_id = a.element_id AND a.member_id = 30000 
    INNER JOIN cal_forms f ON e.form_id = f.form_id 
WHERE 
    f.org_id = 'church3562' 
    AND e.form_id = 1 
/* Inappropriate GROUP BY removed */ 
ORDER BY e.`order` 

Here's the fixed up sqlfiddle,這裏是RIGHT JOIN version因爲這是你開始有什麼。

當然,你可以替代你的佔位符。

SELECT 
    a.answer, 
    e.element_id, 
    e.element_type, 
    e.question, 
    e.description 
FROM 
    cal_form_elements e 
    LEFT JOIN cal_form_answers a ON e.element_id = a.element_id AND a.member_id = ? 
    INNER JOIN cal_forms f ON e.form_id = f.form_id 
WHERE 
    f.org_id = ? 
    AND e.form_id = ? 
ORDER BY e.`order` 
+0

謝謝你的回答!爲了我的目的,「GROUP BY」也必須存在(有時,對於一個'element'可能有多個'answer',但我只需要一個結果),但我已經完成了所有工作。謝謝! – Nathanael

+0

在MySQL中小心使用該組。它不可移植,有時會產生令人困惑的結果。 –

+0

雖然很高興幫助,但歡呼 –