2014-02-04 5 views
6

У меня есть таблицы с более чем 35 столбцами, первые 20 столбцов фиксированы, а число столбцов в каждой таблице различно. Мне нужно выбрать последние 10 столбцов, например, из таблицы, как я могу это достичь? Так же, как этот запрос возвращает 20 лучших записейВыберите последний N # столбцов таблицы из MySQL

select * from table1 limit 10;

Я хочу сделать то же самое с колоннами, я имею в виду вернуть имена столбцов в запросе, а затем использовать эти имена в другом запросе, что-то вроде:

SELECT (SELECT column_name FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = 'table1') FROM table1; 
+2

Вам нужно динамический запрос. –

+0

@ HamletHakobyan Что бы это было? можете ли вы привести пример? – Shahe

+0

попробуйте посмотреть здесь http://stackoverflow.com/questions/17258970/select-first-n-columns-of-mysql-table – marcosh

ответ

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) 
Смежные вопросы