【问题标题】:Query in a LIKE-TREE table在 LIKE-TREE 表中查询
【发布时间】:2023-03-21 14:50:01
【问题描述】:

我有一个包含以下列的表格:

idCat, idParent, Des

idCat 是自动递增的,Des 用于描述,如果记录是父记录,则 idParent 可以为“0”,如果是子记录,则它可以具有父记录的“idCat”值。

我需要查询所有没有孩子的记录的 SELECT "Des",如下所示:

SELECT Des FROM Table HAVING COUNT (idCat=idParent) = 0

显然这个查询不起作用。

你能帮帮我吗?

【问题讨论】:

  • 是否可以在记录不是 root 时将 Mark Bennister 的结果 DES 与每个父级进行 CONCAT?示例:-Apple ---Red ---Yellow 您的查询返回红色和黄色(没问题)。但是可以退回 Apple - Red 和 Apple - Yellow 吗?

标签: mysql sql select count


【解决方案1】:

这可以通过 NOT IN、NOT EXISTS 或 LEFT JOIN ... WHERE NULL 来完成 - 后者通常是 MySQL 中性能最好的:

SELECT t1.Des FROM Table t1
LEFT JOIN Table t2 on t1.idCat = t2.idParent
WHERE t2.idParent IS NULL

【讨论】:

  • @user2396911:很高兴我能帮上忙。 :)
  • 是否可以在记录不是根目录时将生成的 DES 与每个父级进行 CONCAT?示例:-Apple ---Red ---Yellow 您的查询返回红色和黄色(没问题)。但是可以退回 Apple - Red 和 Apple - Yellow 吗?
  • 您需要将连接添加到直接父级 - 类似于 JOIN Table t0 on t0.idCat = t1.idParent - 并将父级包含在连接中,例如 SELECT concat(t0.Des,'-',t1.Des) as CatDes
  • 我需要加入所有父母而不是直接父母。如果我有:Apple -Red --Good 我想获得 Apple -Red - Good
  • 不,不是在 MySQL 中的单个查询中 - 您需要一个 MySQL 不支持的 recursive 查询。 dba.stackexchange.com 上以下问题的公认答案显示了如何通过 MySQL 中的存储过程实现此目的:dba.stackexchange.com/questions/7147/…
【解决方案2】:

如果所有父母 idParent 字段为 0 或 null 则使用此查询

SELECT Des FROM Table HAVING idParent = 0 OR idParent IS NULL

这可行,但使用大数据库时速度较慢;

SELECT Des FROM Table HAVING idParent NOT IN ( SELECT idCat FROM Table )

【讨论】:

    猜你喜欢
    • 2021-05-08
    • 1970-01-01
    • 2015-04-17
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2021-12-02
    相关资源
    最近更新 更多