当用作子查询时,MySQL查询的行为会有所不同

时间:2017-10-23 15:34:24

标签: mysql sql database recursion subquery

我有一个查询,我们用它来评估一个区域中有多少交易。我们的区域是嵌套的子/父记录(每个区域都有一个parent_id。一个区域可以有多个子区域。)

一个事务有一个小部件,一个小部件有一个区域。

要获取某个区域(此处为区域2)的所有子ID的列表,我使用了以下查询:

SELECT id
FROM (
    SELECT id, parent_id FROM areas
    ORDER by parent_id, id
) areas_sorted,
(SELECT @pv := 2) initialisation
WHERE find_in_set(parent_id, @pv) > 0
AND @pv := concat(@pv, ',', id)

这在单独运行时效果很好,它列出了所有区域,包括两个级别的孩子。

但是,当用作这样的子查询时:

SELECT 
COUNT(transactions.id) as transaction_count,
SUM(transactions.widget_price * transactions.widget_quantity) as 'Sum'
FROM transactions
LEFT JOIN widgets ON widgets.id = transactions.widget_id
WHERE widgets.area_id IN (
    SELECT id
    FROM (
        SELECT id, parent_id FROM areas
        ORDER by parent_id, id) areas_sorted,
        (SELECT @pv := 2
    ) initialisation
    WHERE find_in_set(parent_id, @pv) > 0
    AND @pv := concat(@pv, ',', id)
) 
AND transactions.status = 'confirmed';

我们只从区域2下面的第一层获取小部件的交易,而不是下一个子级别的小部件。

0 个答案:

没有答案