由于可以从表中选择前N行,有没有办法从MySQL数据库表中选择前N列?
感谢您的回复,也许是PHP中的部分代码。
答案 0 :(得分:15)
SQL要求您为所需的列命名,或者使用*
通配符。
在关系理论中,没有“前N列”的概念,因为列没有隐含的顺序。当然在SQL的任何具体实现中,它们必须具有一些存储顺序,但SQL语言不支持通过表中的“position”获取列,也不支持获取列的序列(除了*
)。
答案 1 :(得分:12)
请先看看Bill Karwin的answer。但是,如果您知道如何订购列名,则可能会有一个使用动态查询的解决方案。
要从表中选择所有列名,您可以使用如下查询:
SELECT `column_name`
FROM `information_schema`.`columns`
WHERE `table_schema`=DATABASE()
AND `table_name`='yourtablename';
(请查看此answer)。并利用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 your statement执行它:
PREPARE stmt FROM @sql;
EXECUTE stmt;
请参阅小提琴here。
答案 2 :(得分: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)
}
?>