选择MySQL中除一列之外的所有列?
我试图使用select语句从某个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
编辑:此表中有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;