mysql select to return blanks for all but first row of repeating column

前端 未结 5 545
独厮守ぢ
独厮守ぢ 2020-12-21 14:17

Is it possible to create a mysql select (directly or using a stored procedure) that will return blanks for repeating columns. For example, a select that would normally retu

相关标签:
5条回答
  • 2020-12-21 14:32

    For MySQL (I guess it should be similar for other DBs), to avoid repeating a column value on every row, you can make good use of variables. No subqueries necessary: light and quick.

    //Init a variable
    SET @previous:="";
    
    //Remember previous row value
    SELECT IF(Name=@previous, "", @previous:=Name) AS GroupedName, Value
    FROM tableName ORDER BY 1;
    
    0 讨论(0)
  • 2020-12-21 14:34

    Yes, it's possible, but it would be very expensive (subqueries!) and not at all efficient. Whatever language you use or however you transfer this data directly, it's not worth it to have SQL spare these few bytes.

    0 讨论(0)
  • 2020-12-21 14:38

    It seems like it would be a huge waste of resources to not do it through your application, but one way that you could do this is to use PL/SQL in a stored procedure or something similar to populate a some temporary table. With this you could declare a variable for if the name equals the last name that was iterated over. So if the name is a new name add it to the temporary table otherwise do not.

    Again though this is a huge waste of resources

    0 讨论(0)
  • 2020-12-21 14:41

    Following should work but it doesn't return the results in the order you've used in your example.

    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
    
    0 讨论(0)
  • 2020-12-21 14:43

    For future readers, here is a select query that will return blanks for repeating column values.

    SELECT IF(name=@previous, "", @previous:=name) as name_, value
    FROM (SELECT @previous:= '') AS temp, tableName
    ORDER BY name
    
    0 讨论(0)
提交回复
热议问题