所以...我的正确加入不起作用。这听起来很模糊,考虑到所有事情,它可能确实在起作用。然而,对于我的生活,我无法弄清楚发生了什么!为简单起见,这是我的查询。我知道它有点本地化,但它非常简单。
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 :(得分: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`