在MySQL数据库表中,可以选择前N行,那么是否有办法选择前N列呢?
感谢您的回复,希望能提供一些使用PHP编写的代码。
在MySQL数据库表中,可以选择前N行,那么是否有办法选择前N列呢?
感谢您的回复,希望能提供一些使用PHP编写的代码。
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函数来截取返回的字符串,以获取前两个列名为例:
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;
请查看这里的fiddle:here。ORDER BY column_name
更改为ORDER BY ordinal_position
。 - AnnabelSQL需要你命名你想要的列,否则使用*
通配符。
在关系理论中,没有“前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)
}
?>