选择MySQL中除一列之外的所有列?

选择MySQL中除一列之外的所有列?,mysql,select,wildcard,Mysql,Select,Wildcard,我试图使用select语句从某个MySQL表中获取除一列之外的所有列。有没有一个简单的方法可以做到这一点 编辑:此表中有53列(不是我的设计)据我所知,没有。您可以执行以下操作: SELECT col1, col2, col3, col4 FROM tbl column_list=$(echo 'select group_concat(column_name) from information_schema.columns where table_name="TABLE" and column

我试图使用select语句从某个MySQL表中获取除一列之外的所有列。有没有一个简单的方法可以做到这一点


编辑:此表中有53列(不是我的设计)

据我所知,没有。您可以执行以下操作:

SELECT col1, col2, col3, col4 FROM tbl
column_list=$(echo 'select group_concat(column_name) from information_schema.columns where table_name="TABLE" and column_name != "EXCLUDEDFIELD" group by "t"' | MYSQL | tail -n 1)
并手动选择所需的列。但是,如果您需要很多列,那么您可能只需要执行以下操作:

SELECT * FROM tbl 
忽略你不想要的

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

FROM table
就你的具体情况而言,我建议:

SELECT * FROM tbl
除非你只想要几列。如果只需要四列,则:

SELECT col3, col6, col45, col 52 FROM tbl
可以,但是如果您想要50列,那么任何使查询变得(太?)难以阅读的代码。

您可以:

SELECT column1, column2, column4 FROM table WHERE whatever

没有获得column3,但可能您正在寻找更通用的解决方案?

如果您不想选择的列中包含大量数据,并且由于速度问题,您不想将其包括在内,并且您经常选择其他列,我建议您使用一个字段创建一个新表,该字段通常不会使用原始表的键进行选择,并从原始表中删除该字段。在实际需要该额外字段时加入表。

您可以使用并使用该字段的结果动态生成SELECT语句。

在这种情况下,视图是否工作得更好

CREATE VIEW vwTable
as  
SELECT  
    col1  
    , col2  
    , col3  
    , col..  
    , col53  
FROM table

我同意,
选择*
是不够的,如果你不需要的,正如其他地方提到的,是一个BLOB,你不想让开销慢慢增加


我会用所需的数据创建一个视图,然后您可以舒适地
选择*
——如果数据库软件支持它们的话。否则,将巨大的数据放在另一个表中。

如果它总是同一列,那么您可以创建一个不包含它的视图


否则,不,我不这么认为。

最好指定要查询的列,即使您查询了所有列

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


起初我以为你可以使用正则表达式,但我一直在读这本书,你似乎不能。如果我是你,我会使用另一种语言(比如PHP)生成你想要得到的列列表,将其存储为字符串,然后使用它生成SQL

虽然我同意托马斯的回答(+1;),但我想补充一点,我假设您不想要的列几乎不包含任何数据。如果它包含大量的文本、xml或二进制blob,那么请花时间分别选择每一列。否则你的表现会受到影响。干杯

如果愿意,可以使用SQL生成SQL,并对其生成的SQL进行评估。这是一个通用的解决方案,因为它从信息模式中提取列名。下面是Unix命令行中的一个示例

替代

  • 使用MYSQL命令创建MYSQL
  • 具有表名称的表
  • 具有排除字段名的排除字段
实际上,您只需要以这种方式提取列名一次,就可以构造排除该列的列列表,然后只需使用已构造的查询

比如:

SELECT col1, col2, col3, col4 FROM tbl
column_list=$(echo 'select group_concat(column_name) from information_schema.columns where table_name="TABLE" and column_name != "EXCLUDEDFIELD" group by "t"' | MYSQL | tail -n 1)

现在,您可以在您构造的查询中重用
$column\u list
字符串。

实际上有一种方法,您当然需要拥有执行此操作的权限

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

PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
SET@sql=CONCAT('SELECT',(从信息_SCHEMA.COLUMNS中选择REPLACE(GROUP_CONCAT(COLUMN_NAME),',',''),其中TABLE_NAME=''和TABLE_SCHEMA='','FROM');
从@sql准备stmt1;
执行stmt1;
替换
,然后只需执行

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,";
   }      
}

是的,尽管它可能是高I/O,这取决于表。这里是我为它找到的解决方法

SELECT *
INTO #temp
FROM table

ALTER TABLE #temp DROP COlUMN column_name

SELECT *
FROM #temp
在mysql定义(手册)中没有这样的东西。但是,如果您有大量的列
col1
,…,
col100
,以下内容可能很有用:

DROP TABLE IF EXISTS temp_tb;
CREATE TEMPORARY TABLE ENGINE=MEMORY temp_tb SELECT * FROM orig_tb;
ALTER TABLE temp_tb DROP col_x;
   #// ALTER TABLE temp_tb DROP col_a, ... , DROP col_z; #// for a few columns to drop
SELECT * FROM temp_tb;
我同意列出所有列的“简单”解决方案,但这可能会很麻烦,而且打字错误会造成大量时间浪费。我使用函数“getTableColumns”检索适合粘贴到查询中的列的名称。然后我需要做的就是删除那些我不想要的

CREATE FUNCTION `getTableColumns`(tablename varchar(100)) 
          RETURNS varchar(5000) CHARSET latin1
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE res  VARCHAR(5000) DEFAULT "";

  DECLARE col  VARCHAR(200);
  DECLARE cur1 CURSOR FOR 
    select COLUMN_NAME from information_schema.columns 
    where TABLE_NAME=@table AND TABLE_SCHEMA="yourdatabase" ORDER BY ORDINAL_POSITION;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  OPEN cur1;
  REPEAT
       FETCH cur1 INTO col;
       IF NOT done THEN 
          set res = CONCAT(res,IF(LENGTH(res)>0,",",""),col);
       END IF;
    UNTIL done END REPEAT;
  CLOSE cur1;
  RETURN res;
结果返回逗号分隔的字符串,例如

col1,col2,col3,col4,…col53


我的主要问题是在连接表时得到了很多列。虽然这不是您问题的答案(如何从一个表中选择除特定列以外的所有列),但我认为值得一提的是,您可以指定
表。
从特定表中获取所有列,而不是仅指定

这是一个非常有用的示例:

select users.*, phone.meta_value as phone, zipcode.meta_value as zipcode from users left join user_meta as phone on ( (users.user_id = phone.user_id) AND (phone.meta_key = 'phone') ) left join user_meta as zipcode on ( (users.user_id = zipcode.user_id) AND (zipcode.meta_key = 'zipcode') ) 选择users.*,phone.meta_值作为phone,zipcode.meta_值作为zipcode 来自用户 左加入用户_meta作为电话 on((users.user\u id=phone.user\u id)和(phone.meta\u key='phone')) 作为zipcode左加入用户\u meta on((users.user\u id=zipcode.user\u id)和(zipcode.meta\u key='zipcode'))
结果是users表中的所有列,以及从meta表连接的另外两列。

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

内部替换函数代码将“
”替换为“”,如果要替换的字段是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>');
SET@sql=CONCAT('SELECT'),(选择REPLACE(GROUP_CONCAT(COLUMN_NAME)),
'',''字段\u已删除\'')
从信息_SCHEMA.COLUMNS
其中表_NAME=“”
表_SCHEMA='','FROM');
替换
和`

删除的列是rep
SET @database    = 'database_name';
SET @tablename   = 'table_name';
SET @cols2delete = 'col1,col2,col3';

SET @sql = CONCAT(
'SELECT ', 
(
    SELECT GROUP_CONCAT( IF(FIND_IN_SET(COLUMN_NAME, @cols2delete), NULL, COLUMN_NAME ) )
    FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tablename AND TABLE_SCHEMA = @database
), 
' FROM ',
@tablename);

SELECT @sql;
SET @@group_concat_max_len = 2048;
public function getColsExcept($table,$remove){
    $res =mysql_query("SHOW COLUMNS FROM $table");

    while($arr = mysql_fetch_assoc($res)){
        $cols[] = $arr['Field'];
    }
    if(is_array($remove)){
        $newCols = array_diff($cols,$remove);
        return "`".implode("`,`",$newCols)."`";
    }else{
        $length = count($cols);
        for($i=0;$i<$length;$i++){
            if($cols[$i] == $remove)
                unset($cols[$i]);
        }
        return "`".implode("`,`",$cols)."`";
    }
}
mysql_query("SELECT ".$db->getColsExcept('table',array('id','bigtextcolumn'))." FROM table");
mysql_query("SELECT ".$db->getColsExcept('table','bigtextcolumn')." FROM table");
SELECT *, NULL AS salary FROM users
SET @SQL = CONCAT('SELECT ', (SELECT GROUP_CONCAT(CONCAT("`", COLUMN_NAME, "`")) FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' AND COLUMN_NAME NOT IN ('id')), ' FROM users');
PREPARE stmt1 FROM @SQL;
EXECUTE stmt1;
SELECT CONCAT('SELECT ',
( SELECT GROUP_CONCAT(t.col)
FROM
(
    SELECT CASE
    WHEN COLUMN_NAME = 'eid' THEN NULL
    ELSE COLUMN_NAME
    END AS col 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'employee' AND TABLE_SCHEMA = 'test'
) t
WHERE t.col IS NOT NULL) ,
' FROM employee' );
SELECT table_name,column_name 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'employee' AND TABLE_SCHEMA = 'test'
table_name  column_name
employee    eid
employee    name_eid
employee    sal
'SELECT name_eid,sal FROM employee'
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 *, LEFT(col1, 0) AS col1, LEFT(col2, 0) as col2 FROM table
SELECT `purchase_history`.`id`,
    `purchase_history`.`user_id`,
    `purchase_history`.`deleted_at`
FROM `fs_normal_run_2`.`purchase_history`;
SELECT * FROM fs_normal_run_2.purchase_history;