mysql选择返回所有空白,但重复列的第一行

问题描述:

是否可以创建一个mysql select(直接或使用存储过程),它将返回空白以重复列。例如,选择通常有2列返回这7个记录:mysql选择返回所有空白,但重复列的第一行

Bob 123 
Bob 557 
Bob 888 
Joe 887 
Joe 223 
Tom 899 
Tom 999 

我宁愿直接看到这个从SQL SELECT:

Bob 123 
     557 
     888 
Joe 887 
     223 
Tom 899 
     999 

我知道我可以只发布过程记录在我的程序中,但我想用sql调用中的空白替换重复项。

是的,这是可能的,但它会是非常昂贵(子查询!),而且根本没有效率。无论您使用哪种语言,或者您直接传输此数据,都不值得让SQL将这几个字节留空。

看起来如果不通过应用程序执行它会浪费大量资源,但可以这样做的一种方法是在存储过程中使用PL/SQL或类似的东西来填充临时表。有了这个,你可以声明一个变量,如果该名称等于迭代的姓氏。所以如果这个名字是一个新名字,那么把它添加到临时表中,否则不要。

虽然再次,这是一个巨大的资源

下面应该工作的浪费,但它不能在你已经在你的例子使用的顺序返回结果。

SELECT IF(n.ID = nm.ID, n.Name, NULL) 
     , n.ID 
FROM Names n 
     INNER JOIN (
      SELECT Name 
        , ID = MIN(ID) 
      FROM Names   
      GROUP BY 
        Name 
     ) nm ON nm.Name = n.Name 
ORDER BY 
     n.Name 
     , n.ID 

对于MySQL(我想这应该是其他类似的DB),以避免对每一行重复列值,你可以好好利用的变量。没有必要的子查询:轻而快。

//Init a variable 
SET @previous:=""; 

//Remember previous row value 
SELECT IF([email protected], "", @previous:=Name) AS GroupedName, Value 
FROM tableName ORDER BY 1; 

对于将来的读者,这里是一个选择查询,它将返回空格以重复列值。

SELECT IF([email protected], "", @previous:=name) as name_, value 
FROM (SELECT @previous:= '') AS temp, tableName 
ORDER BY name 
+0

如果只在相同的select语句中读取和写入变量不是未定义的行为。 – philipxy 2018-02-13 08:39:35