我有这个查询:
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。
我希望得到以下结果:
active
为25,且id
中active
设置为1的选项的ID和文本。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。在active
或num_children
中,我将JOIN
设置为5或根本没有结果。
感谢您的帮助(和阅读!)
这里是要测试的完整结构和数据:
WHERE
答案 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`