【问题标题】:Can someone explain this SQL query to me?有人可以向我解释这个 SQL 查询吗?
【发布时间】:2011-07-14 06:48:03
【问题描述】:

我正在阅读this article,我正在尝试理解这个 SQL 语句,但我对 SQL 还是有些陌生。

我不确定 comment 和 c 指的是什么。
我认为其中一个是表名,但我不确定另一个。此外,显然其中有一个我没有任何经验的子查询:

  SELECT c.id, c.user_id, c.body, c.deep, c.lineage, c.parent_id,
         (SELECT COUNT(*) 
            FROM comment 
           WHERE comment.lineage LIKE (CONCAT(c.lineage,'%')) 
             AND comment.lineage != c.lineage) AS replies
    FROM comment as c
ORDER BY c.lineage

【问题讨论】:

标签: php sql explain


【解决方案1】:
SELECT c.id,
       c.user_id,
       c.body, 
       c.deep, 
       c.lineage, 
       c.parent_id, (
       SELECT COUNT(*)
         FROM comment
        where comment.lineage LIKE (CONCAT(c.lineage,'%'))
          AND comment.lineage!=c.lineage)
       as replies
       FROM comment as c 
       order by c.linea

第一个列表是所有要选择的字段,前缀ccomment表后面的别名。

查询中的查询是子查询,它运行执行类似操作并将.clineage%(即通配符)连接起来的查询。这个子查询结果保存在replies中。

结果按linea排序。

【讨论】:

  • 看到这样的格式让我立刻明白了。谢谢。
【解决方案2】:

c 是名为comment 的表的别名,该表使用comment as c 定义。

【讨论】:

    【解决方案3】:

    comment 确实是此查询中的表名。 c 是用于该表的别名(在 comment as c 语法中),因此在查询的其他地方可以使用 c 而不是整个表名来引用 comment 表。

    在这种特殊情况下,子查询也从同一个表中查询,别名允许它从父查询中引用同一个表。这在这里很有用,因为在子查询的上下文中,c.lineage 是一个静态值(从父查询返回的每行),用于过滤子查询中的行(comment.lineage)。然后,子查询可以为父查询的每一行返回一个值,并且该值在结果中将别名为名称 replies

    【讨论】:

      【解决方案4】:

      "comment" 是表名,"c" 只是它的别名,以节省输入。该查询从 cmets 表中获取 cmets 列表。它返回c.id, c.user_id, c.body, c.deep, c.lineage, c.parent_id 指定的列数,以及(SELECT COUNT(*) FROM comment where comment.lineage LIKE (CONCAT(c.lineage,'%')) AND comment.lineage!=c.lineage) as replies 指定的对此评论的回复数

      【讨论】:

        【解决方案5】:

        Comment 是一个表,c 是最后一个注释表引用的别名。所以,c.id 指的是评论表最后一个实例中的 id 列。

        【讨论】:

          【解决方案6】:

          你的想法非常接近。 comment 是表名,c 也是。请参阅将注释标记为 c 的 FROM comment as c' 行。子查询是那些外部 () 内的所有内容

          【讨论】:

            【解决方案7】:

            as 关键字为某事物创建了一个别名,以便您以后可以明确地引用它。所以,comment 指的是表,c 是同一个表的别名。这特别有用,因为您在两个不同的上下文中(在主查询和子查询中)引用 comment

            它还允许您将名称 replies 分配给子查询的结果:

            (SELECT COUNT(*) 
               FROM comment 
              WHERE comment.lineage LIKE (CONCAT(c.lineage,'%')) 
                AND comment.lineage!=c.lineage) as replies
            

            【讨论】:

              猜你喜欢
              • 2022-10-07
              • 2011-07-31
              • 2012-04-19
              • 1970-01-01
              • 1970-01-01
              • 2014-10-13
              • 2010-10-04
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多