选择MySQL表的前N列

par*_*eed 9 mysql

由于可以从表中选择前N行,有没有办法从MySQL数据库表中选择前N列?
感谢您的回复,也许是PHP的一些代码部分.

Bil*_*win 15

SQL要求您命名所需的列,否则使用*通配符.

在关系理论中,没有"前N列"的概念,因为列没有隐含的顺序.当然在SQL的任何具体实现中,它们必须具有一些存储顺序,但SQL语言不支持通过表中的"position"获取列,也不支持获取列的序列(除了*).


fth*_*lla 12

请先看看Bill Karwin的回答.但是,如果您知道如何订购列名,那么可能会有一个使用动态查询的解决方案.

要从表中选择所有列名,可以使用如下查询:

SELECT `column_name` 
FROM   `information_schema`.`columns` 
WHERE  `table_schema`=DATABASE() 
       AND `table_name`='yourtablename';
Run Code Online (Sandbox Code Playgroud)

(请看看这个答案).并使用GROUP_CONCAT:

GROUP_CONCAT(CONCAT('`', column_name, '`') ORDER BY column_name)
Run Code Online (Sandbox Code Playgroud)

我们可以在一行中返回所有列名,用逗号分隔:

`col1`, `col2`, `col3`, ...
Run Code Online (Sandbox Code Playgroud)

(我还在列的名称周围添加了引号,请注意我们必须以某种方式订购列的列表,否则无法保证返回列名的顺序).

然后我们可以使用SUBSTRING_INDEX剪切返回的字符串,以获得例如前两个列名:

SUBSTRING_INDEX(columns, ',', 2)
Run Code Online (Sandbox Code Playgroud)

和我们的最终查询,连接'SELECT ',上面的选定列' FROM Tab1',以及将结果字符串插入@sql变量是这样的:

SELECT
  CONCAT(
    'SELECT ',
    SUBSTRING_INDEX(
      GROUP_CONCAT(CONCAT('`', column_name, '`') ORDER BY column_name),
      ',',
      2),
    ' FROM Tab1'
  )
FROM
  information_schema.columns 
WHERE
  table_schema=DATABASE() 
  AND table_name='Tab1'
INTO @sql;
Run Code Online (Sandbox Code Playgroud)

它的价值将是这样的:

@sql = "SELECT `col1`, `col2` FROM Tab1"
Run Code Online (Sandbox Code Playgroud)

然后你可以准备你的陈述并执行它:

PREPARE stmt FROM @sql;
EXECUTE stmt;
Run Code Online (Sandbox Code Playgroud)

请看这里的小提琴.

  • 对于列*不*按字母顺序排列并且您仍然需要前 N 列的一般情况:将“ORDER BY column_name”更改为“ORDER BY ordinal_position”。 (2认同)