2014-02-19 76 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

虽然很高兴帮助,但欢呼 –