14

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

4

3 回答 3

16

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

在关系理论中,没有“前 N 列”的概念,因为列没有隐含的顺序。当然在任何具体的 SQL 实现中,它们都必须有一定的存储顺序,但是 SQL 语言不支持按表中的“位置”取列,也不支持取列的序列(除了*)。

于 2013-06-23T08:40:28.517 回答
16

请先看看比尔卡尔文的回答。但是,如果您知道如何对列名进行排序,那么可能会有一个使用动态查询的解决方案。

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

SELECT `column_name` 
FROM   `information_schema`.`columns` 
WHERE  `table_schema`=DATABASE() 
       AND `table_name`='yourtablename';

(请看一下这个答案)。并利用GROUP_CONCAT

GROUP_CONCAT(CONCAT('`', column_name, '`') ORDER BY column_name)

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

`col1`, `col2`, `col3`, ...

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

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

SUBSTRING_INDEX(columns, ',', 2)

我们的最终查询,它连接'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;

它的价值将是这样的:

@sql = "SELECT `col1`, `col2` FROM Tab1"

然后您可以准备您的语句并执行它:

PREPARE stmt FROM @sql;
EXECUTE stmt;

在此处查看小提琴。

于 2013-06-23T09:44:50.020 回答
1

您不能直接在 MySQL 中执行此操作,您必须在服务器端执行此操作。在 PHP 中,这可能看起来像这样:

<?php
$mysqli->real_query("SELECT id, title, name FROM test ORDER BY id ASC");
$res = $mysqli->use_result();

$numberOfColumnsToShow = 2;

while ($row = $res->fetch_assoc()) {
    // Only select the first $numberOfColumnsToShow columns
    $rowWithSpecifiedNumberOfColumns = array_slice($row, 0, $numberOfColumnsToShow);

    // $rowWithSpecifiedNumberOfColumns only contains the first two columns (id, title)
}
?>
于 2013-06-23T09:00:13.523 回答