我试图使用一个选择语句从某个MySQL表中获得除一个以外的所有列。有什么简单的方法吗?

编辑:在这个表格中有53列(不是我的设计)


当前回答

Mahomedalid发布的答案有一个小问题:

在替换函数代码中替换“<columns_to_delete>,”用“”,如果要替换的字段是concat字符串中的最后一个字段,那么这个替换会有一个问题,因为最后一个字段没有字符逗号“,”并且没有从字符串中删除。

我的建议:

SET @sql = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME),
                  '<columns_to_delete>', '\'FIELD_REMOVED\'')
           FROM INFORMATION_SCHEMA.COLUMNS
           WHERE TABLE_NAME = '<table>'
             AND TABLE_SCHEMA = '<database>'), ' FROM <table>');

替换<表>,<数据库>和'

在我的情况下,被删除的列被字符串“FIELD_REMOVED”所取代,这是因为我试图安全内存。(我正在删除的字段是一个大约1MB的BLOB)

其他回答

即使要查询所有列,也最好指定要查询的列。

因此,我建议您在语句中写下每一列的名称(不包括您不想要的列)。

SELECT
    col1
    , col2
    , col3
    , col..
    , col53

FROM table

公认的答案有几个缺点。

当表或列名需要反引号时,该方法失败 如果要省略的列位于列表的最后,则会失败 它需要列出两次表名(一次用于选择文本,另一次用于查询文本),这是多余和不必要的 它可能以错误的顺序返回列名

所有这些问题都可以通过在GROUP_CONCAT的分隔符中包含反勾号并使用WHERE条件而不是REPLACE()来克服。出于我的目的(我想很多人也是如此),我希望列名按照它们在表中出现的顺序返回。为了实现这一点,我们在GROUP_CONCAT()函数中使用了显式的ORDER BY子句:

SELECT CONCAT(
    'SELECT `',
    GROUP_CONCAT(COLUMN_NAME ORDER BY `ORDINAL_POSITION` SEPARATOR '`,`'),
    '` FROM `',
    `TABLE_SCHEMA`,
    '`.`',
    TABLE_NAME,
    '`;'
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE `TABLE_SCHEMA` = 'my_database'
    AND `TABLE_NAME` = 'my_table'
    AND `COLUMN_NAME` != 'column_to_omit';

只做

SELECT * FROM table WHERE whatever

然后用您最喜欢的编程语言php删除该列

while (($data = mysql_fetch_array($result, MYSQL_ASSOC)) !== FALSE) {
   unset($data["id"]);
   foreach ($data as $k => $v) { 
      echo"$v,";
   }      
}

您可以使用DESCRIBE my_table并使用其结果动态地生成SELECT语句。

如果你想排除一个字段的值,例如安全问题/敏感信息,你可以检索该列为空。

e.g.

SELECT *, NULL AS salary FROM users