7

我正在阅读这篇文章,并试图理解这个 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
4

7 回答 7

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

于 2011-03-13T00:34:32.317 回答
2

ccomment是用定义的表的别名comment as c

于 2011-03-13T00:34:28.807 回答
2

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

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

于 2011-03-13T00:35:16.863 回答
1

“comment”是表名,“c”只是它的别名,以节省输入。该查询从评论表中获取评论列表。它返回由 指定的列数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

于 2011-03-13T00:34:57.700 回答
0

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

于 2011-03-13T00:34:11.007 回答
0

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

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

(SELECT COUNT(*) 
   FROM comment 
  WHERE comment.lineage LIKE (CONCAT(c.lineage,'%')) 
    AND comment.lineage!=c.lineage) as replies
于 2011-03-13T00:35:13.100 回答
0

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

于 2011-03-13T00:35:39.527 回答