选择MySQL表的前N列

选择MySQL表的前N列,mysql,Mysql,由于可以从表中选择前N行,有没有办法从MySQL数据库表中选择前N列? 感谢您的回复以及PHP中的部分代码。SQL要求您命名所需的列,或者使用*通配符 在关系理论中,没有“前N列”的概念,因为列没有隐含的顺序。当然,在SQL的任何具体实现中,它们都必须具有一定的存储顺序,但是SQL语言不支持通过表中的“位置”获取列,也不支持获取列序列(除了*)。您不能在MySQL中直接执行此操作,必须在服务器端执行此操作。在PHP中,这可能如下所示: <?php $mysqli->real_quer

由于可以从表中选择前N行,有没有办法从MySQL数据库表中选择前N列?

感谢您的回复以及PHP中的部分代码。

SQL要求您命名所需的列,或者使用
*
通配符


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

您不能在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)
}
?>
SELECT `column_name` 
FROM   `information_schema`.`columns` 
WHERE  `table_schema`=DATABASE() 
       AND `table_name`='yourtablename';
@sql = "SELECT `col1`, `col2` FROM Tab1"

请看一下比尔·卡温的第一本。但是,如果您知道如何对列名进行排序,那么可能会有一种利用动态查询的解决方案

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

<?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)
}
?>
SELECT `column_name` 
FROM   `information_schema`.`columns` 
WHERE  `table_schema`=DATABASE() 
       AND `table_name`='yourtablename';
@sql = "SELECT `col1`, `col2` FROM Tab1"
(请看一下这个)。以及利用:

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

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

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

SUBSTRING_INDEX(columns, ',', 2)
最后一个查询将
'SELECT'
、上面所选的列和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;
它的价值是这样的:

<?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)
}
?>
SELECT `column_name` 
FROM   `information_schema`.`columns` 
WHERE  `table_schema`=DATABASE() 
       AND `table_name`='yourtablename';
@sql = "SELECT `col1`, `col2` FROM Tab1"
然后,您可以执行以下操作:

PREPARE stmt FROM @sql;
EXECUTE stmt;

请参阅fiddle。

也就是说,您当然可以使用PHP人工实现这一点,并根据某种有序约定命名列。但是不,不是SQL。谢谢Bill提供的完整信息,这对我很有帮助,我对它投了赞成票。但fthiella和Erik answer对我的帮助更大,因为他们向我和后来访问这个问题的所有人共享代码。“在关系理论中,没有“前N列”的概念,因为列没有隐含顺序。”对这个。我应该试试这个。我想这是可以接受的答案,但让我先试试。看看是否有更好的答案:)只有一个问题。对于大型数据库,您会这样做吗?“这会给我带来速度问题吗?”parsaeed说,这取决于你的数据库有多大。事实上,MySQL需要返回所有列,包括不显示的列。如果出现性能问题还有待观察,那么您应该做一些性能基准测试。虽然这样做可能有合理的理由,这意味着你的存储模型有问题。@strawbery存储模型没有问题,但我有一个合理的理由来进行我需要的许多不同查询。一个合理的理由就是在编码时从mysql提示符浏览表(这就是我到达此页的原因)。@michael回到2013年,我可能会在意的。我可以向你保证,我现在不知道。回答得很好,很完整。非常感谢。我认为,如果您添加更多信息,并在答案中添加此小提琴的表格视图,并在代码行上添加一些有用的注释,这将成为一个不错的wiki答案。@parsaeed谢谢!你是对的,我编辑并添加了更多的信息,我的答案,我希望一切都是清楚的!干得好!现在就像是一个很好的学习班。非常感谢。如果列不是按字母顺序排列的,而您仍然需要前N列,那么一般情况下:将
按列名称排序
更改为
按顺序位置排序