如何从符合条件的列中选择数据?

时间:2016-05-18 08:03:10

标签: php mysql sql database

嗨我在mysql数据库中有一个表,其中包含类似UI_12-Apr-2016,DA_12-Apr-2016的列。

----------------------------------------------------------------------
| DA_12-Apr-2016  | UI_13-Apr-2016 | UI_12-Apr-2016 | DA_13-Apr-2016 | 
|---------------------------------------------------------------------
|                                                                    |
----------------------------------------------------------------------

如何从列中包含2016年4月12日的表中获取数据。有没有办法根据标准选择数据。我知道我可以运行这个查询: -

SELECT UI_12-Apr-2016,DA_12-Apr-2016 from table;

但是它之前的日期和代码可以是任何东西。我想创建一个动态查询来从与日期条件匹配的列中获取数据。

如果有人能提供解决方案,我将非常感激。

5 个答案:

答案 0 :(得分:2)

你的意思是:

SELECT * FROM table WHERE column LIKE '%13-Apr-2016%';

更新:您应该查看information_schema数据库:

SELECT COLUMN_NAME from `COLUMNS` where `TABLE_NAME` = 'table_name' AND `COLUMN_NAME` LIKE '%12-Apr-2016%';

简单的PHP示例脚本可以是:

$table_name = 'table_name';
$col_pattern = '12-Apr-2016';

$mysqli = new mysqli($config['host'], $config['user'], $config['password'], $config['dbname']);
$sql1 = "SELECT COLUMN_NAME from `COLUMNS` where `TABLE_NAME` = '{$table_name}' AND `COLUMN_NAME` LIKE '%{$col_pattern}%'";
$res1 = $mysqli->query($sql1);
$acol = array();
while ($r1 = $res1->fetch_assoc()) {
    $acol[] = $r1['COLUMN_NAME'];
}
if (!empty($acol)) {
    $sql2 = 'SELECT ' . implode(', ', $acol) . ' FROM ' . $table_name;
    $res2 = $mysqli->query($sql2);
    while ($r2 = $res2->fetch_assoc()) {
        echo var_export($r2, 1) . PHP_EOL;
    }   
}

答案 1 :(得分:2)

This may help:

select COLUMN_name
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='Table1' and column_name like "%12-Apr-2016%";

in the above query, we can search for column names from INFORMATION_SCHEMA.COLUMNS table(which holds data related to table specified).

Output of above query should:

UI_12-Apr-2016
DA_12-Apr-2016

The result of above query is a list of columns with the pattern given(%12-Apr-2016%). You may save this result in a list and use it to fetch data accordingly from the table.

There is no direct method or query to do the same.

答案 2 :(得分:2)

也许您可以创建一个新表tbl_column,其中一列column_name包含所有列〜 SELECT * FROM tbl_column WHERE column_name LIKE'%12-Apr-2016%'; 然后你可以使用查询结果生成一个新的动态sql~

答案 3 :(得分:1)

由于MySQL没有eval()函数,因此 不可能动态提出列的名称。由于您使用的是PHP,因此最好从您的应用程序构造查询以实现此目的。

如果您确实坚持使用MySQL的解决方案,那么有一个使用prepared statements的解决方案并不难以解决,如下所示:

set @table='your_table_name';

select group_concat(column_name) 
from information_schema.columns 
where table_name='your_table_name' 
and column_name like '%12_Apr_2016' 
into @colnames;

set @construct= CONCAT('SELECT ', @colnames, ' FROM ', @table);
prepare query from @construct;
execute query;

SQL Fiddle供参考。

但总的来说,使用动态生成的DDL命名的列不是最好的模式建模实践。

答案 4 :(得分:1)

您必须动态地将SQL语句放在一起。例如。以下语句使用Oracle视图ALL_TAB_COLUMNS为包含select column_name from table_name的每个列生成12-Apr-2016语句:

SELECT 'SELECT ' || COLUMN_NAME || ' FROM ' || TABLE_NAME || ';'
FROM ALL_TAB_COLUMNS
WHERE TABLE_NAME = 'MY_TABLE'
AND COLUMN_NAME LIKE '%12-Apr-2016%'

这可能不是你想要的,但是,这说明了一般的想法。