我有超过35列的表,前20列是固定的,每列中的列号不同。我需要从表格中选择最后10列,我该如何实现?就像这个查询返回前20条记录
一样 select * from table1 limit 10;
我想对列做同样的事情我的意思是在查询中返回列名,然后在另一个查询中使用这些名称,如:
SELECT (SELECT column_name FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = 'table1' ) FROM table1;
答案 0 :(得分:3)
您可以通过准备好的陈述来实现这一目标。您的查询将如下所示:
SELECT
CONCAT('SELECT ',
GROUP_CONCAT(COLUMN_NAME),
' FROM test')
FROM
(SELECT
COLUMN_NAME,
ORDINAL_POSITION
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_SCHEMA='test'
AND
TABLE_NAME='test'
ORDER BY
ORDINAL_POSITION DESC LIMIT 10) AS ord_desc
ORDER BY
ord_desc.ORDINAL_POSITION
- 这将创建一个包含以下内容的SQL:
SELECT date,title FROM test
(在上面的示例中,我在选择中有2列,可在此部分进行调整:ORDER BY ORDINAL_POSITION DESC LIMIT 10
)
所以你需要做的就是准备这个陈述。就我而言:
SQL:
mysql> set @sql=(SELECT CONCAT('SELECT ', GROUP_CONCAT(COLUMN_NAME), ' FROM test') FROM (SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='test' ORDER BY ORDINAL_POSITION DESC LIMIT 2) AS ord_desc ORDER BY ord_desc.ORDINAL_POSITION); Query OK, 0 rows affected (0.02 sec)
准备:
mysql> prepare stmt from @sql; Query OK, 0 rows affected (0.00 sec)
结果:
mysql> execute stmt; +------------+--------------+ | date | title | +------------+--------------+ | 2014-02-04 | my event 001 | | 2014-02-04 | my event 002 | | 2014-02-05 | my event 003 | | 2014-02-05 | my event 004 | | 2014-02-05 | my event 005 | | 2014-02-07 | my event 006 | | 2014-02-07 | my event 007 | +------------+--------------+ 7 rows in set (0.00 sec)