是否可以创建一个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调用中用空格替换重复项。
答案 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