Выбрать все столбцы, кроме одного в MySQL? - PullRequest
333 голосов
/ 12 августа 2008

Я пытаюсь использовать оператор выбора, чтобы получить все столбцы из определенной таблицы MySQL, кроме одного. Есть ли простой способ сделать это?

РЕДАКТИРОВАТЬ: в этой таблице 53 столбца (НЕ МОЙ ДИЗАЙН)

Ответы [ 29 ]

5 голосов
/ 15 мая 2012

Мне понравился ответ от @Mahomedalid помимо этого факта, сообщенного в комментарии от @Bill Karwin. Возможная проблема, поднятая @Jan Koritak, является верной, я сталкивался с этим, но я нашел для этого хитрость и просто хочу поделиться ею здесь для всех, кто столкнулся с проблемой.

мы можем заменить функцию REPLACE предложением where в подзапросе оператора Prepared следующим образом:

Использование имени моей таблицы и столбца

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

Надеюсь, это поможет любому, кто ищет решение.

Привет

4 голосов
/ 12 августа 2008

Рекомендуется указывать запрашиваемые столбцы, даже если вы запрашиваете все столбцы.

Поэтому я бы предложил вам написать имя каждого столбца в утверждении (исключая тот, который вам не нужен).

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

FROM table
4 голосов
/ 07 января 2010

Просто сделай

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,";
   }      
}
4 голосов
/ 07 января 2011

Я согласен с «простым» решением перечисления всех столбцов, но это может быть обременительным, а опечатки могут привести к потере большого количества времени. Я использую функцию «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

3 голосов
/ 12 августа 2008

Я согласен, что Select * недостаточно, если тот, который вам не нужен, как упоминалось в другом месте, является BLOB, вы не хотите, чтобы эти накладные расходы закрались.

Я бы создал представление с необходимыми данными, затем вы можете Select * с комфортом - если программное обеспечение базы данных их поддерживает. Иначе, поместите огромные данные в другую таблицу.

3 голосов
/ 13 августа 2008

Сначала я подумал, что вы можете использовать регулярные выражения, но, поскольку я читал документы MYSQL , кажется, вы не можете. На вашем месте я бы использовал другой язык (например, PHP) для генерации списка столбцов, которые вы хотите получить, сохранить его в виде строки и затем использовать его для генерации SQL.

3 голосов
/ 22 марта 2013

Я тоже этого хотел, поэтому вместо этого создал функцию.

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)."`";
    }
}

Итак, как это работает, вы вводите таблицу, а затем столбец, который вам не нужен, или как массив: массив («id», «name», «whatcolumn»)

Так что в select вы можете использовать его так:

mysql_query("SELECT ".$db->getColsExcept('table',array('id','bigtextcolumn'))." FROM table");

или

mysql_query("SELECT ".$db->getColsExcept('table','bigtextcolumn')." FROM table");
2 голосов
/ 07 августа 2015

Согласитесь с ответом @ Махомедалида. Но я не хотел делать что-то вроде подготовленного утверждения и не хотел вводить все поля. Так что у меня было глупое решение. Перейдите к таблице в phpmyadmin-> sql-> select, она выдаст копию запроса на замену и готово! :)

2 голосов
/ 16 июня 2012

Основываясь на ответе @Mahomedalid, я сделал несколько улучшений для поддержки "выберите все столбцы, кроме некоторых в mysql"

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;

Если у вас много столбцов, используйте этот sql для изменения group_concat_max_len

SET @@group_concat_max_len = 2048;
2 голосов
/ 24 февраля 2010

Да, хотя это может быть высокий уровень ввода-вывода в зависимости от таблицы, здесь я нашел обходной путь.

Select *
into #temp
from table

alter table #temp drop column column_name

Select *
from #temp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...