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 找到。

具有 categorysub-categories 不直接与 thread 关联

只有没有 categorysub-categoriesthreads 相关联

举个例子

Computer -> MAC -> MacBook 
Computer -> WINDOWS -> HP

在上面的示例中,只有 categories MacBookHPthreads 相关联

我试图通过下面的查询实现的是在给定父类

的所有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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...