有人能解释一下这个SQL查询吗?

7

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

你可能也对这个问题感兴趣 何时使用SQL表别名 - Roman
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表的别名。
查询中的查询是子查询,运行执行like并将.clineage%(通配符)连接的查询。此子查询结果保存在replies中。
结果按linea排序。

1
看到它以这种格式排版,让我立刻理解了它。谢谢。 - John Smith

2

c 是一个别名,指向一个名为 comment 的表,该表定义为 comment as c


2
comment是查询中的一个表名。在语法comment as c中,c是该表的别名,这样在查询的其他地方,可以仅使用c引用comment表而无需使用整个表名。
在这种特定情况下,子查询也从同一张表中查找数据,别名使其能够从父查询中引用相同的表。这在这里很有用,因为在子查询的上下文中,c.lineage是一个静态值(每行返回自父查询),用于过滤子查询中的行(使用comment.lineage)。子查询可以为每行父查询返回单个值,该值被别名为replies

1
"comment"是表名,"c"只是为了节省输入而设置的别名。查询从评论表中获取评论列表。它返回由指定的列数,以及该评论的回复数量,由(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

0

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


0

你的想法非常接近。comment是表名,c也是如此。请看标注为FROM comment as c的那一行,它将comment标记为c。子查询是括号内的所有内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接