我想选择数据库中的所有行,但希望它们以倒序排列。意思是,我想将第一列数据用作新实体,将当前实体用作第一列。我想你明白我的意思
这是一个例子
id | name | marks
-------------------------------
1 | Ram | 45
--------------------------------
2 | Shyam | 87
至
id | 1 | 2 |
----------------------------
Name | Ram | Shyam |
----------------------------
Marks | 45 | 87 |
使用固定的已知列,这里是做这的方法(我将表命名为“ grades”是自由的):
创建并执行不同查询的并集。
由于您需要实际数据作为列标题,因此联合的第一部分如下所示:
SELECT 'id', '1', '2', ....
仅该查询将复制结果,因此我们需要通过添加告诉MySQL我们需要有0行LIMIT 0, 0
。
联合的第一行将包含'Name'
和表的“名称”列中的所有数据。要获得该行,我们需要一个查询,例如:
SELECT 'Name',
(SELECT Name FROM grades LIMIT 0, 1),
(SELECT Name FROM grades LIMIT 1, 1),
(SELECT Name FROM grades LIMIT 2, 1),
...
使用相同的逻辑,我们的第二行将如下所示:
SELECT 'Marks',
(SELECT Marks FROM grades LIMIT 0, 1),
(SELECT Marks FROM grades LIMIT 1, 1),
(SELECT Marks FROM grades LIMIT 2, 1),
...
我们需要从MySQL产生一行,例如:
SELECT 'id', '1', '2', ... LIMIT 0, 0;
为了获得这一行,我们将使用CONCAT()和GROUP_CONCAT()函数:
SELECT 'id',
(SELECT GROUP_CONCAT(CONCAT(' \'', id, '\'')) FROM grades)
LIMIT 0, 0;
我们将把该行存储到一个新变量中:
SET @header = CONCAT('SELECT \'id\', ',
(SELECT GROUP_CONCAT(CONCAT(' \'', id, '\'')) FROM grades),
' LIMIT 0, 0');
我们需要创建两个如下查询:
SELECT 'Name',
(SELECT Name FROM grades LIMIT 0, 1),
(SELECT Name FROM grades LIMIT 1, 1),
(SELECT Name FROM grades LIMIT 2, 1),
...
由于我们事先不知道原始表中有多少行,因此我们将使用变量来生成不同的LIMIT x, 1
语句。可以使用以下方法生产它们:
SET @a = -1;
SELECT @a:=@a+1 FROM grades;
使用此代码段,我们可以创建子查询:
SELECT GROUP_CONCAT(
CONCAT(' (SELECT name FROM grades LIMIT ',
@a:=@a+1,
', 1)')
)
FROM grades
我们将把它与第一列数据(这是第二列的名称)一起放入变量名@ line1中:
SET @a = -1;
SET @line1 = CONCAT(
'SELECT \'Name\',',
(
SELECT GROUP_CONCAT(
CONCAT(' (SELECT Name FROM grades LIMIT ',
@a:=@a+1,
', 1)')
)
FROM grades
));
通过遵循相同的逻辑,第二行将是:
SET @a := -1;
SET @line2 = CONCAT(
'SELECT \'Marks\',',
(
SELECT GROUP_CONCAT(
CONCAT(' (SELECT Marks FROM grades LIMIT ',
@a:=@a+1,
', 1)')
)
FROM grades
));
现在,我们的三个变量包含:
@header:
SELECT 'id', '1', '2' LIMIT 0, 0
@line1:
SELECT 'Name', (SELECT Name FROM grades LIMIT 0, 1),
(SELECT name FROM grades LIMIT 1, 1)
@line2:
SELECT 'Marks', (SELECT Marks FROM grades LIMIT 0, 1),
(SELECT marks FROM grades LIMIT 1, 1)
我们只需要使用创建最终变量CONCAT()
,将其准备为新查询并执行即可:
SET @query = CONCAT('(',
@header,
') UNION (',
@line1,
') UNION (',
@line2,
')'
);
PREPARE my_query FROM @query;
EXECUTE my_query;
(供测试和参考):
SET @header = CONCAT('SELECT \'id\', ',
(SELECT GROUP_CONCAT(CONCAT(' \'', id, '\'')) FROM grades),
' LIMIT 0, 0');
SET @a = -1;
SET @line1 = CONCAT(
'SELECT \'Name\',',
(
SELECT GROUP_CONCAT(
CONCAT(' (SELECT Name FROM grades LIMIT ',
@a:=@a+1,
', 1)')
)
FROM grades
));
SET @a := -1;
SET @line2 = CONCAT(
'SELECT \'Marks\',',
(
SELECT GROUP_CONCAT(
CONCAT(' (SELECT Marks FROM grades LIMIT ',
@a:=@a+1,
', 1)')
)
FROM grades
));
SET @query = CONCAT('(',
@header,
') UNION (',
@line1,
') UNION (',
@line2,
')'
);
PREPARE my_query FROM @query;
EXECUTE my_query;
输出:
+ ------- + ------ + ------- +
| id | 1 | 2 |
+ ------- + ------ + ------- +
| 姓名| 拉姆| Shyam |
| 商标| 45 | 87 |
+ ------- + ------ + ------- +
设置2行(0.00秒)
我仍然不确定为什么需要将行转换为列,并且我确定我提出的解决方案并不是最佳的解决方案(就性能而言)。
您甚至可以使用我的解决方案作为开始,并使之适应于不知道表列名称(和行数)的通用解决方案information_schema
。COLUMNS
作为来源,但我想这太过分了。
我坚信最好将原始表放入数组中,然后旋转该数组,从而以所需的格式获取数据。
问题内容: 我有一个具有这种结构的表。 我无法弄清楚我将使用哪种SQL查询来获得这样的结果集: 我正在尝试将三列分为三个单独的行。这可能吗? 问题答案: SELECT Y.UserID, Y.UserName, QuestionName = ‘AnswerToQuestion’ + X.Which, Response = CASE X.Which WHEN ‘1’ THEN AnswerToQue
问题内容: 我遇到一个问题,当我尝试选择某个列的值为NULL的行时,它将返回一个空集。但是,当我查看phpMyAdmin中的表时,对于大多数行,它表示为null。 我的查询看起来像这样: 每次都清空。 据说有很多地方都确保不会将其存储为“ NULL”或“ null”,而不是实际值,还有一个地方试图仅查找空格(),但没有一个起作用。有人建议不要使用MyISAM并使用innoDB,因为MyISAM无法
问题内容: 一个菜鸟MYSQL用户....我有一个简单的MySQL查询,该查询返回值,并使用GROUP_CONCAT函数: 但是,我需要转置查询,以便它以单独的列而不是行的形式返回“名称”。MySQL完全有可能吗? 问题答案: 您需要执行一项操作,MySQL本身不支持该操作(与某些其他RDBMS不同)。 您可以获得的最接近的结果是按照以下几行构造SQL: 如果可能的值是动态的,则可以从以下结果中以
问题内容: 我的问题是我有一个这样的表: c1 | c2 | c3 | c4是一个由|分隔的值。 我的最终结果应如下所示: 我该怎么做呢? 谢谢 问题答案: 这就是您可以执行的操作,使用管道将字符串拆分并使用spark函数爆炸数据 输出: 希望这可以帮助!
问题内容: 我正在尝试从SQLite表中提取数据,该表将键值对存储在双列中。例如,用钥匙,,,和,该表将如下所示: 我想执行一个查询,以行作为键,值作为行,每行都给我。像这样: 我唯一能想到的解决方案是每个键的联接: 有一个更好的方法吗? 问题答案: 另一个可用的选项是使用 条件聚合 :
我在csv文件中有一个列,其中包含此格式的人员详细信息: 实际csv格式: 我想将它们拆分为一个新的csv文件,如下所示: 拆分详细信息: 拆分行分隔符: