根据元组mysql

时间:2016-09-24 15:55:08

标签: mysql sql

说,我有一张桌子

A   B   C   D   E   F
1   2   4   3   6   5
4   2   3   1   6   5
4   5   3   6   1   2


如何根据基于其数据的重新排列获得输出。例如,

ABDCFE
DBCAFE
EFCABD

有可能吗?

编辑:

问题似乎在于:如何按值按顺序获取列名列表?

4 个答案:

答案 0 :(得分:1)

您似乎要求输出,其中输出中的每一行只是列中数据值顺序的规范。 然后,如果值始终是1到5之间的整数,则可以通过输出' A'的字符值来实现。数据值为1,a' B'其中数据值为2,等等。这个SQL会这样做。

Select Char(A+64)A, Char(B+64) B, 
  Char(C+64) C, Char(D+64) D, 
  Char(E+64) E, Char(F+64) F
From table

如果想要在一个输出列中使用列排序顺序,您也可以这样做:

Select Char(A+64) + Char(B+64) + 
  Char(C+64) + Char(D+64) +
  Char(E+64) + Char(F+64) SortOrder
From table

答案 1 :(得分:1)

SQL根本不是执行您描述的操作的工具,因为它违反了relation的概念。我并不是说“关系”的共同用法意味着关系 ship ,我的意思是关系的数学定义。

  • 关系中没有列的顺序。列是一个集合,根据定义是无序的。列由其名称标识,而不是从左到右的位置。
  • 每个相应命名列下的行中的所有条目必须是同一数据域的一部分。如果你逐行混合使用它们,你就违反了这一点。

我猜你的所有列A到F实际上都是在同一个数据域中使用值,否则重新排序它们没有任何意义。如果这是真的,那么您通过定义具有重复列组的表来违反First Normal Form。您应该将所有六列都放在第二个表的一列中。然后按值对它们进行排序变得非常容易。

基本上,通过在某些应用程序代码中格式化数据结果,可以更好地解决您尝试做的事情。

答案 2 :(得分:1)

我明白了。您希望对每行中的值进行排序,并按顺序显示列的名称。

我假设您有一个行ID,因此您可以识别每一行。然后:

select id, group_concat(which order by val) as ordered_column_names
from ((select id, a as val, 'A' as which from t) union all
      (select id, b, 'B' as which from t) union all
      (select id, c, 'C' as which from t) union all
      (select id, d, 'D' as which from t) union all
      (select id, e, 'E' as which from t) union all
      (select id, f, 'F' as which from t)
     ) t
group by id
order by id;

答案 3 :(得分:1)

有一种方法可以做到这一点,按列顺序获取库存名称并打印出来。 对于coulmn中的每个值,重复此操作并获取cloumn数据中指定的序号的列名。这里的序数位置是每个库仑数据的值。迭代每一行和每一列,你的问题就解决了。

select column_name 
from information_schema.columns 
where table_name = 'my_table_name' and ordinal_position = 2;