我有一个查询,我们用它来评估一个区域中有多少交易。我们的区域是嵌套的子/父记录(每个区域都有一个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下面的第一层获取小部件的交易,而不是下一个子级别的小部件。