mysql选择为除了重复列的第一行之外的所有行返回空白

时间:2011-04-14 19:53:47

标签: mysql sql

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

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调用中用空格替换重复项。

5 个答案:

答案 0 :(得分:3)

以下内容应该有效,但不会按照您在示例中使用的顺序返回结果。

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

答案 1 :(得分:2)

是的,这是可能的,但它会非常昂贵(子查询!)并且根本没有效率。无论你使用什么语言,或者你直接传输这些数据,让SQL占用这几个字节是不值得的。

答案 2 :(得分:1)

如果不通过您的应用程序执行此操作似乎会浪费大量资源,但是您可以这样做的一种方法是在存储过程中使用PL/SQL或类似的东西来填充一些临时的表。有了这个,您可以声明一个变量,如果名称等于迭代的姓氏。因此,如果名称是新名称,则将其添加到临时表中,否则将其添加到临时表中。

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

答案 3 :(得分:1)

对于MySQL(我猜它应该与其他数据库类似),为了避免在每一行上重复一个列值,你可以很好地利用变量。没有必要的子查询:轻快。

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

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

答案 4 :(得分:0)

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

SELECT IF(name=@previous, "", @previous:=name) as name_, value
FROM (SELECT @previous:= '') AS temp, tableName
ORDER BY name