【问题标题】:Generate a column with value 1 if first parent_id level > 1 than id level如果第一个 parent_id 级别 > 1 比 id 级别,则生成值为 1 的列
【发布时间】:2014-08-20 14:27:21
【问题描述】:

我想从表中获取所有数据,并在具有此 parent_id 的条目的父项中动态生成值为 1 的列。并且应该兼容“sql server”、“postgres”、“mysql”。

id,parent_id,lft,rgt,level,title,alias,access,path,checked_out
1  0         0   7   0     root   root   0    root ...
2  1         1   2   1     ...

结果应该是:

id,parent_id,lft,rgt,level,**button**,title,alias,access,path,checked_out
1  0         0   7   0        1       root   root   0    root  0...
2  1         1   2   1        **0**       ...

这有可能吗,我以前从来没有做过这么复杂的查询。

它应该选择所有表条目,生成一个值为 1 或 0 的新按钮列,并且这仅在其条目的父级别

类似这样的东西,但是所有条目的结果:

SELECT a.id,b.id,a.level,a.level+1 as button
FROM `categories` a
JOIN `categories` b ON a.id=b.parent_id
WHERE a.id < b.id AND a.level+1 = b.level AND b.id-a.id=1;

【问题讨论】:

  • 这在使用 Postgres 和 SQL Server 时会很容易,但对于 MySQL 来说却非常困难,因为它缺乏现代 SQL 功能。
  • @a_horse_with_no_name 虽然我同意,但令人惊讶的是 MySQL 用户可以使用查询变量模拟/伪造有多少现代 SQL 功能。有时真的希望我们在 PostgreSQL 中有这些。
  • 为什么您需要它才能在所有这些 RDBMS 中工作?试图保持“db-agnostic”是一个很大的痛苦,而且很容易出错。
  • 它必须在 cms 上工作
  • @ChrisGitare 那么 CMS 需要支持动态查询调度,它可以在有通用查询的情况下进行查询,然后覆盖使用的不同数据库(如果提供)。因此,您可以编写“SQL Standard(ish)”查询(通常适用于 PostgreSQL、MS SQL Server)、“funky Oracle 查询”和“MySQL 过程查询”。可悲的是,尝试编写与 DB 无关的逻辑繁重的查询注定要失败。

标签: mysql sql sql-server postgresql


【解决方案1】:

CASEEXISTS 应该适用于所有这些 RDBMS:

SELECT id, parent_id, lft, rgt, level
     , CASE WHEN EXISTS (
          SELECT 1 FROM tbl AS b
          WHERE  b.parent_id = a.id
          AND    b.level = a.level + 1
          -- AND    b.id > a.id   -- this one is redundant
          AND    b.id = a.id + 1)
       THEN 1 ELSE 0 END AS button
     , ...
FROM   tbl AS a;

这将返回有 any 个子代的行带有button = 1。否则button = 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 2012-03-26
    • 2018-03-30
    • 2013-07-21
    相关资源
    最近更新 更多