mysql-如何不重复派生表的子查询

mysql-如何不重复派生表的子查询,mysql,sql,subquery,derived,Mysql,Sql,Subquery,Derived,我想知道一列的值在结果中显示了多少次,并将其包含在每一行的结果列中。如何在不重复派生表的子查询两次的情况下实现这一点?如果在COUNT子查询中将(derivedtable)替换为“t”,则表示该表不存在 SELECT col1, col2, col3, (SELECT COUNT(*) FROM (derivedtable) WHERE t.col1=col1) FROM (derivedtable) AS t 你能用分组方式吗 SELECT col1, col2, col3, COUNT(*

我想知道一列的值在结果中显示了多少次,并将其包含在每一行的结果列中。如何在不重复派生表的子查询两次的情况下实现这一点?如果在COUNT子查询中将(derivedtable)替换为“t”,则表示该表不存在

SELECT
col1,
col2,
col3,
(SELECT COUNT(*) FROM (derivedtable) WHERE t.col1=col1)
FROM (derivedtable) AS t

你能用
分组方式吗

SELECT col1, col2, col3, COUNT(*)
FROM (derivedtable) AS t
GROUP BY col1;
这将返回任意值
col2
col3
。您可以使用
group\u concat()
获得完整的列表:

编辑:

如果确实希望在不重复派生表的情况下执行此操作,可以使用变量:

SELECT col1, col2, col3,
       @col1cnta := if(@col1a = col1, @col1cnta, col1cnt) as col1cnt,
       @col1a := col
FROM (SELECT col1, col2, col3,
             @col1cnt := if(@col1 = col1, 0, @col1cnt) + COUNT(*) as col1cnt,
             @col1 := col1
      FROM (derivedtable) t cross join
           (select @col1 := '', @col1cnt := 0) const
      GROUP BY col1
     ) t cross join
     (select @col1a := '', @col1cnta := 0) const
ORDER BY col1, col1cnt desc;

这里的想法是对三列的每个组合进行子计数。然后,按
col1
对结果进行排序,但计数顺序相反,并在给定
col1
的所有行中复制最大值,以创建真实视图:使用MySQL是不可能的,因为它缺少公共表表达式。所谓“不重复子查询”是否意味着必须键入两次,或者MySQL会对结果的每一行执行它吗?我的意思是MySQL会执行两次(比实际对SELECT的每一行执行一次还要多),我想这就是它的工作原理。我确实需要一个完整的列表,这就是我为什么不使用GROUPBY的原因。然而,我在阅读了有关group_concat函数的内容后并没有意识到它,我不可能使用它,因为我无法对结果进行任何后处理以将结果分解为单独的行,因为我将mysql结果直接输入一个php类,而这是不允许的。我不会说不可能,但这将是非常复杂的,我需要另一个解决方案,如果有一个。@navark。如果还从其他列返回值,为什么需要按
col1
计数?您不想为每一行指定一个计数吗?我不确定我是否理解您的问题,但它是针对每一行的,因为我需要每一行计算其自身col1的值“其中t.col1=col1”。如果可能的话,我需要完全在mysql中完成这项工作,因为在php中完成这项工作会非常复杂。但为了进一步澄清,我需要按照“col1在结果中出现的次数”对结果进行排序,例如:如果第1行有col1=3,col1=3总共出现20次,那么它的排名将高于仅出现10次的结果,我的想法是在order by子句中使用我试图创建的列。您的解决方案仍然存在使用GROUP by的问题,因此不是一个完整的列表。然而,我已经适应了它一点,并设法做到我想要的。非常感谢。我会尽快发布解决方案(不能,因为没有足够的声誉与网站)。
Solution :

SELECT col1, col2, col3,
       @col1cnta := if(@col1a = col1, @col1cnta, col1cnt) as col1cntfinal,
       @col1a := col1
FROM (SELECT col1, col2, col3,
             @col1cnt := if(@col1 = col1, @col1cnt+1, 1) as col1cnt,
             @col1 := col1
      FROM (derivedtable) t cross join
           (select @col1 := '', @col1cnt := 0) const
      ORDER BY col1
     ) t2 cross join
          (select @col1a := '', @col1cnta := 0) const
ORDER BY col1, col1cnt desc;
Solution :

SELECT col1, col2, col3,
       @col1cnta := if(@col1a = col1, @col1cnta, col1cnt) as col1cntfinal,
       @col1a := col1
FROM (SELECT col1, col2, col3,
             @col1cnt := if(@col1 = col1, @col1cnt+1, 1) as col1cnt,
             @col1 := col1
      FROM (derivedtable) t cross join
           (select @col1 := '', @col1cnt := 0) const
      ORDER BY col1
     ) t2 cross join
          (select @col1a := '', @col1cnta := 0) const
ORDER BY col1, col1cnt desc;