右加入不加入?

时间:2014-02-19 21:39:51

标签: mysql sql

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

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

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`