2011-03-13 70 views
7

我在阅读this article,我试图理解这条SQL语句,但我对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 
+0

您可能也有兴趣在这个问题上[使用当SQL表别名](http://stackoverflow.com/questions/198196/when-to-use-sql-table -alias) – R0MANARMY 2011-03-13 00:39:37

回答

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

看到它的格式是这样,让我立刻就明白了。谢谢。 – 2011-03-13 00:53:28

0

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

2

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

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

0

指定的as关键字创造的东西的别名,这样你可以参考它后来明确。所以,comment引用该表,c是该表的别名。这是特别有用的,因为您在两个不同的上下文中(在主查询和子查询中)引用comment

它也可以让你的名字replies分配给你的子查询的结果:

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

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

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

0

你的想法非常接近。注释是表名,c也是。看到将注释标记为c的行注释为c'。子查询里面那些外的一切()

相关问题