我试图使用一个选择语句从某个MySQL表中获得除一个以外的所有列。有什么简单的方法吗?
编辑:在这个表格中有53列(不是我的设计)
我试图使用一个选择语句从某个MySQL表中获得除一个以外的所有列。有什么简单的方法吗?
编辑:在这个表格中有53列(不是我的设计)
当前回答
这个问题是关于MySQL的,但我仍然认为值得一提的是,至少谷歌BigQuery和H2原生支持* EXCEPT语法。
SELECT * FROM actor
生产:
|actor_id|first_name|last_name |last_update |
|--------|----------|------------|-----------------------|
|1 |PENELOPE |GUINESS |2006-02-15 04:34:33.000|
|2 |NICK |WAHLBERG |2006-02-15 04:34:33.000|
|3 |ED |CHASE |2006-02-15 04:34:33.000|
而
SELECT * EXCEPT (last_update) FROM actor
生产:
|actor_id|first_name|last_name |
|--------|----------|------------|
|1 |PENELOPE |GUINESS |
|2 |NICK |WAHLBERG |
|3 |ED |CHASE |
也许,MySQL的未来版本也会支持这种语法?
其他回答
我也想要这个,所以我创建了一个函数。
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)."`";
}
}
所以它的工作原理是,你输入表格,然后是你不想要的列或在数组中:array("id","name","whatevercolumn")
所以在select中你可以这样使用它:
mysql_query("SELECT ".$db->getColsExcept('table',array('id','bigtextcolumn'))." FROM table");
or
mysql_query("SELECT ".$db->getColsExcept('table','bigtextcolumn')." FROM table");
如果愿意,可以使用SQL生成SQL,并对生成的SQL进行评估。这是一种通用的解决方案,因为它从信息模式中提取列名。下面是一个Unix命令行的示例。
替换
MYSQL的MYSQL命令 带有表名的TABLE 包含排除字段名的EXCLUDEDFIELD
echo $(echo 'select concat("select ", group_concat(column_name) , " from TABLE") from information_schema.columns where table_name="TABLE" and column_name != "EXCLUDEDFIELD" group by "t"' | MYSQL | tail -n 1) | MYSQL
实际上,您只需要以这种方式提取列名一次,就可以构造排除该列的列列表,然后只需使用已构造的查询。
比如:
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_list字符串。
你可以:
SELECT column1, column2, column4 FROM table WHERE whatever
没有得到列3,尽管您可能在寻找一个更一般的解?
据我所知,没有。你可以这样做:
SELECT col1, col2, col3, col4 FROM tbl
并手动选择所需的列。然而,如果你想要很多列,那么你可能只需要做一个:
SELECT * FROM tbl
忽略你不想要的。
针对你的特殊情况,我建议:
SELECT * FROM tbl
除非你只想要几列。如果你只想要四列,那么:
SELECT col3, col6, col45, col 52 FROM tbl
这很好,但如果您想要50个列,那么任何使查询变得(太?)难以阅读的代码。
我喜欢@Mahomedalid的回答,除了@Bill Karwin评论中提到的事实。@Jan Koritak提出的可能的问题是真的,我遇到过,但我找到了一个技巧,只是想在这里与面临这个问题的人分享。
我们可以在Prepared语句的子查询中用where子句替换replace函数,如下所示:
使用我的表和列名
SET @SQL = CONCAT('SELECT ', (SELECT GROUP_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;
因此,这将只排除字段id,而不包括company_id