我不完全确定我正在尝试做的事情是可能的。你能在左联盟的条件下使用OR吗?我从用户表开始,然后它可以从week_meal到用餐(添加他们不属于他们的每周膳食计划的膳食)或直接用餐(他们拥有的一餐)。该部分似乎有效,但是当我在选择中包含mta.meal_to_add_id时,它会错误地将不符合LEFT JOIN标准的膳食拉到meal_to_add。
摆弄结构:http://sqlfiddle.com/#!2/7bd9c4
SELECT DISTINCT m.*, o.username as owner,i.*, mta.meal_to_add_id, follow_id
FROM webusers wu
LEFT JOIN week_meal wm ON wu.id=wm.user_id
LEFT JOIN meal m ON (wu.id=m.user_id OR wm.meal_id=m.meal_id)
LEFT JOIN webusers o ON m.user_id=o.id
LEFT JOIN meal_to_add mta ON
((wm.user_id = mta.user_id AND wm.meal_id=mta.meal_id)
OR (m.user_id=mta.user_id AND m.meal_id=mta.meal_id))
JOIN ingredient i ON m.meal_id = i.meal_id
LEFT JOIN follow f ON
m.user_id!=wu.id AND
m.user_id=f.followed_webuser_id
AND wu.id=f.followee_webuser_id
WHERE wu.id=5 AND m.meal_id in (138)
ORDER BY m.meal, i.ingredient_id
输出:它应该只是包含mta.meal_to_add_id的字段,在这种情况下,所有行都应为NULL(18)
答案 0 :(得分:0)
要回答问题的第一部分:是的,您可以在OR
中使用LEFT JOIN
子句。
至于第二部分,简单来说,这就是查询似乎所说的内容:
加入周膳'对用户ID的用户。通过相同的用户ID 或为用户加入用餐,并在用餐ID上为用户加入餐饮。现在假设我们有一些匹配的膳食/用户组合,其中一些膳食行在用户上匹配,而其他膳食行在膳食ID上匹配。
接下来,再次加入网络用户。现在,我们的膳食行可能与两组用户匹配。因此,当mta尝试匹配膳食时,它匹配两组可能的膳食/用户组合。
我在这种情况下的做法是将查询分解为两个查询并将中间结果放入临时表(使用MEMORY引擎),然后从中进行选择。