有人可以向我解释这个SQL查询吗?

时间:2011-03-13 00:29:36

标签: php sql explain

我正在阅读this article并且我正在尝试理解这个SQL语句,但我仍然对SQL有些新意。

我不确定评论和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

7 个答案:

答案 0 :(得分:3)

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

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

查询中的查询是一个子查询,它运行该查询,并执行.clineage%(通配符)。此子查询结果保存在replies

结果按linea排序。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

“comment”是表名,“c”只是保存输入的别名。该查询从comments表中获取注释列表。它返回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

指定的此评论的回复数量

答案 4 :(得分:0)

Comment是一个表,c是最后一个注释表引用的别名。因此,c.id引用注释表的最后一个实例中的id列。

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

你的想法非常接近。 comment是表名,c也是。请参阅将注释标记为c'的行,将注释标记为c。子查询是那些outer()

中的所有内容