如何解决CTE 内的相关子查询不同步
鉴于下面的查询,
我面临的问题如下
WHERE
initial_categories.id = categories.id
在上面的条件中,categories.id
应该与外部的 category.id 同步。
这在我使用 sqlite
时有效(categories.id
与外部值同步)
但是,当我出于某种原因使用 MysqL
时,条件中的 categories.id
只取外部 categories.id
中的第一个值,并且在那之后它不会改变(在其他words 不同步),更具体地说,categories.id
在 CTE 中始终具有值 1
。
我无法弄清楚是什么问题。有什么想法吗?
SELECT
*,(
SELECT
id
FROM
threads
WHERE
threads.category_id IN
(
WITH recursive recursive_categories AS
(
SELECT
initial_categories.id
FROM
categories AS initial_categories
WHERE
initial_categories.id = categories.id
UNION ALL
SELECT
remaining_categories.id
FROM
recursive_categories
JOIN
categories AS remaining_categories
ON recursive_categories.id = remaining_categories.parent_id
)
SELECT
id
FROM
recursive_categories
)
ORDER BY
updated_at DESC limit 1
)
AS recently_active_thread_id
FROM
"categories"
WHERE
"parent_id" IS NULL
AND "categories"."group_category_id" IN
(
1,2,3,4,5,6,7,8
)
------查询的目的-------
我有桌子
categories
- id
- parent_id
- title
threads
- id
- category_id
- title
现在一个 category
可以有 sub-categories
,它可以使用 parent_id
表中的 categories
找到。
具有 category
的 sub-categories
不直接与 thread
关联
只有没有 category
的 sub-categories
与 threads
相关联
举个例子
Computer -> MAC -> MacBook
Computer -> WINDOWS -> HP
在上面的示例中,只有 categories
MacBook
和 HP
与 threads
相关联
sub-categories
中找到最新线程
为了继续上述示例,我想找到与 Computer
类别间接关联的最新线程
解决方法
如果您想确保 categories.id
将成为 outer 类别 ID,您可以为外部 categories
取别名,例如:
FROM categories AS outer_categories
WHERE 子句是:
WHERE initial_categories.id = outer_categories.id
所以改为:
SELECT outer_categories.*,(
SELECT id
FROM threads
WHERE category_id IN (
WITH recursive recursive_categories AS (
SELECT initial_categories.id
FROM categories AS initial_categories
WHERE initial_categories.id = outer_categories.id
UNION ALL
SELECT remaining_categories.id
FROM recursive_categories JOIN categories AS remaining_categories
ON recursive_categories.id = remaining_categories.parent_id
)
SELECT id FROM recursive_categories
)
ORDER BY updated_at DESC limit 1
) AS recently_active_thread_id
FROM categories AS outer_categories
WHERE outer_categories.parent_id IS NULL
AND outer_categories.group_category_id IN (1,2,3,4,5,6,7,8)
,
我创建了一个返回最新线程 id 的函数。
本质上,我将查询和子查询移动到一个函数中,它可以工作
CREATE FUNCTION `recently_active_thread`(category_id INT) RETURNS int
BEGIN
DECLARE recentThreadId INT;
SELECT id
INTO recentThreadId
FROM threads
WHERE threads.category_id IN ( WITH recursive recursive_categories AS
(
SELECT initial_categories.id
FROM categories AS initial_categories
WHERE initial_categories.id=category_id
UNION ALL
SELECT remaining_categories.id
FROM recursive_categories
JOIN categories AS remaining_categories
ON recursive_categories.id=remaining_categories.parent_id )
SELECT id
FROM recursive_categories )
ORDER BY updated_at DESC limit 1;
return recentThreadId;
end
然后我在select语句中调用函数
SELECT outer_categories.*,recently_active_thread(outer_categories.id)
FROM categories AS outer_categories
WHERE outer_categories.parent_id IS NULL
AND outer_categories.group_category_id IN (1,8)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。