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