在MySQL中选择除一个字段外的所有字段

16

可能是重复问题:
如何在MySQL中选择除一个字段外的所有字段?

我想知道是否有一种方法可以从数据库表中选择除一个字段以外的所有字段。

我知道可以在select查询中描述字段名称。
例如:

SELECT fieldname1, fieldname2, fieldname3, fieldname4 FROM tablename;

但我的问题是,有没有一种简单的方法来做到这一点...就像这样

SELECT * FROM tablename EXCEPT(fieldname3);

我正在使用MySQL和Zend框架。


6
如果你想将一个数字加5,你会写 a += 5 吗?因为你懒得打 a = a+1+1+1+1+1 吗?编写代码通常涉及可读性。如果在您的 SQL 查询中,您想选择除一个之外的所有列,则最接近您想要实现的形式确实类似于 SELECT * EXCEPT lame_field FROM ... - Jules Colle
1
这太愚蠢了,他们没有更简单的方法来做这件事,比如SELET *,~id等等。当使用“CREATE TABLE WITH SELECT FROM”时,我们最常想要省略自动id。 - mahen3d
我完全同意mahen3d的观点,怎么会这样呢?我在SQL中有两个共享相同结构的表。如果将来我想修改/添加/删除列,我不想在代码的某些部分也必须添加这些列。这样做不仅难以维护,而且是一个坏主意,会导致你的应用程序出现错误。 - Juan Vilar
3个回答

12

你可以轻松地像这样做。

假设你的字段是一个id = 5。

那么

   select * from your_table where id !=5 

如果你指的是列,那么假设你不想选择 column3,那么

   select column1,column2,column4 from tablename;

如果你有很多列

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

    PREPARE stmt1 FROM @sql;
   EXECUTE stmt1;

19
哇,难怪人们都开始逃离SQL了,这真是一团糟。 - SSH This

7

是的,您可以从information_schema.columns获取数据。

SET @sql = CONCAT('SELECT ', (SELECT GROUP_CONCAT(COLUMN_NAME) FROM 
information_schema.columns WHERE table_schema = 'dbo' AND table_name = 
'tablename' AND column_name NOT IN ('c1', 'c2')), 
' from dbo.tablename');  

PREPARE stmt1 FROM @sql;

EXECUTE stmt1;

6
尝试这个 -
SHOW FIELDS FROM `tablename` WHERE FIELD NOT IN ('f1','f2','f3');

执行此查询并获取特定字段名称,将每个字段名称放入数组中。然后在select查询中使用implode函数将数组分隔符为','。
$fields = implode(',',$fields_arr);
$sql = SELECT $fields FROM `tablename`;

不行,这在MYSQL中至少不起作用。 - Juan Vilar
1
这种方法的正确方式应该是在MYSQL中使用: SHOW COLUMNS FROM <TABLENAME> WHERE Field !='<COLUMNNAME>' - Juan Vilar
在MySQL 5.7.19-0ubuntu0.16.04.1上,“SHOW FIELDS”和“SHOW COLUMNS”会给我相同的结果。 - alexandre-rousseau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接