根据其他左联接计算左联接

时间:2018-11-21 19:19:16

标签: mysql sql

我有这个查询:

HttpContext

有一个SELECT options.id, options.text, COUNT(options2.id) AS num_children FROM options JOIN history_uids AS uids ON uids.uid = options.id LEFT JOIN options AS options2 ON (options.id = options2.id_parent) LEFT JOIN history_uids AS uids1 ON uids1.uid = options2.id WHERE ( options.id = 25 AND (uids1.active = 1 OR options2.id IS NULL) # Problem ) GROUP BY `options`.`id` 表,另一个options,其中有一个名为history_uids的列,其中包含每个选项的ID,而一个uid列设置为1或0。

我希望得到以下结果:

  1. 选项active为25,且idactive设置为1的选项的ID和文本。
  2. history_uids等于id_parent(25)并且id中的active设置为1的选项数

因此,无论这个数字是多少,如果将history_uids设置为1,我应该得到我的行。我不知道如何实现这一点:我想将其设置为最后一个条件active,但是为了得到它应该在uids1.active = 1 OR "options2 doesn't exist"的{​​{1}}中有我的active条件,这是不可能的,因为那时表ON尚未被引用...

在我的情况下,该行将options2设置为1,并有5个子级,其中history_uids设置为0,因此我应该将active设置为0。在activenum_children中,我将JOIN设置为5或根本没有结果。

感谢您的帮助(和阅读!)

这里是要测试的完整结构和数据:

WHERE

1 个答案:

答案 0 :(得分:1)

您需要将针对子行的active测试放入ON子句中,以便将不活动的行从LEFT JOIN中过滤掉。而且,您应该计算uids1.uid,而不是options2.id,因为直到与uids1一起加入之前,不活动的行才会被过滤掉。

SELECT options.id, options.text, 
    COUNT(uids1.uid) AS num_children
FROM options
JOIN history_uids AS uids
    ON uids.uid = options.id
LEFT JOIN options AS options2
    ON (options.id = options2.id_parent)
LEFT JOIN history_uids AS uids1
    ON uids1.uid = options2.id and uids1.active = 1
WHERE 
uids.active = 1
GROUP BY `options`.`id`

DEMO