MySQL'de biri hariç tüm sütunlar seçilsin mi?


365

Biri dışında belirli bir MySQL tablosundan tüm sütunları almak için bir select deyimi kullanmaya çalışıyorum. Bunu yapmanın kolay bir yolu var mı?

DÜZENLEME: Bu tabloda 53 sütun var (TASARIMI DEĞİL)


6
53 sütun? Thomas bu durumda önerdiği gibi SELECT * ile sopa olurdu ... ekstra sütun almak için istenmeyen veri büyük miktarda olmadığı sürece ...?
Mike Stone

Bir sütun hariç ... Sanırım hangisinin göz ardı edilmesi gerektiğini biliyorsunuz, bu nedenle BİLGİ_SCHEMA. Sütunlar yoludur.
Alfabravo

Bu cevaba göz atın , ne yapmak istediğinizi yapar!
donL

Büyük veri sütunu, coğrafi veriler tutulduğunda gerçek bir sorundur. Sütunlar boyut olarak çok megabayt olabilir. Satırları bulmak için cümlelerin bulunduğu yerlerde iyi çalışırlar, ancak genellikle sonuçlarda bu verileri istemezsiniz.
Jason

Bunun yaygın bir kullanımı, otomatik artış kimliği sütununu hariç tutmaktır. Örneğin, kendi kimliğine sahip farklı bir tabloya eklenecek verileri seçmek için.
ToolmakerSteve

Yanıtlar:


222

Aslında bunun bir yolu var, bunu yapmak için elbette izinlere sahip olmanız gerekiyor ...

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;

Değiştirme <table>, <database> and <columns_to_omit>


20
uyarı: BİLGİ_SCHEMA sorgularının performansı oldukça düşüktür, bu nedenle bu tür sorguların hiçbir şey için kritik yolda olmadığına dikkat edin.
Bill Karwin

9
@Jan Koritak'ın aşağıda belirttiği gibi, başlığın kaldırmak istediğiniz sütunları da tutmak istediğiniz herhangi bir sütun için başlığın bir alt dizesi ise bu cevap aslında işe yaramaz. Burada bulabileceğiniz daha iyi bir cevap var .
donL

8
Bu, bilinen en iyi uygulama olan sütunları belirtmekten çok daha kötüdür.
HLGEM

3
Sütun adlarında boşluk varsa bu çalışmaz. Her zaman backticks isimleri çevrelemek için güncellenmelidir<column_name>
adamF

3
Bu, yok sayılacak sütun tablo yapısında listelenen son sütunsa da işe yaramaz (çünkü değiştirme, sondaki komaya uymayacaktır).
Vincent Pazeller

61

MySQL tanımlarında (manuel) böyle bir şey yoktur. Ama gerçekten çok sayıda sütununuz varsa col1, ..., col100aşağıdakiler yararlı olabilir:

DROP TABLE IF EXISTS temp_tb;
CREATE TEMPORARY TABLE ENGINE=MEMORY temp_tb SELECT * FROM orig_tb;
ALTER TABLE temp_tb DROP col_x;
SELECT * FROM temp_tb;

4
3. adımda bana hata mesajı verdi: "Sütun sayısı 1. satırdaki değer sayısıyla eşleşmiyor". Bu yüzden 2. adımı "UPDATE temp_tb SET id = NULL" olarak değiştirdim ve sonra çalıştı.
oyvey

1
Tamam, bu işe yarıyor. Ama bu sorguyu tekrar çalıştırdığımda, bana bir hata veriyor, temp_tb zaten var. Temp_tb bellekte ne kadar süre kalır? Aptalca bir soru olursa özür dilerim. PS cevabınızı onayladı.
Karan

2
@Karan Bu sorguyu tekrar tekrar çalıştırmak için, DROP TABLE IF EXISTS temp_tb;
başa

1
@Karan Bellek motorunu belirtmek için: komutunu kullanın CREATE TEMPORARY TABLE temp_tb ENGINE=MEMORY (SELECT * FROM orig_tb); , aksi takdirde varsayılan olarak diske kaydedilir ve sunucunun yeniden başlatılmasını sağlar. ( teşekkürler )
gregn3

Mükemmel cevap. İçin birden fazla sütun bırakarak , bakın bu cevap .
S3DEV

45

Bir Görünüm bu durumda daha iyi çalışır mı?

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

15
HAHA! Evet tabi. Şimdi görünümü tüm AMA sütunlardan birini içerecek şekilde nasıl oluşturursunuz. Bunun orijinal soruya nasıl yalvartığını görüyorsunuz. Aslında, bu iş parçacığı özellikle görünüm tanımında kalan tüm sütunları açıkça listelemek zorunda kalmadan belirli sütunları dışlayan bir görünüm oluşturmak istedim çünkü bulundu.
Chris Nadovich

31

Yapabilirsin:

SELECT column1, column2, column4 FROM table WHERE whatever

sütun3 almadan, belki daha genel bir çözüm arıyordunuz?


3
Daha yüksek puanlı cevapların çoğu sadece elle yazmadan bu kesin sorguyu oluşturmak için yollar bulmak
mehtunguh

5
Aslında, bakım nedenleriyle, "dışında her şey" tür bir sorguya sahip olmak yararlıdır. Aksi takdirde, daha sonra yeni alanlar eklenirse açık alan listeleri güncellenmelidir.
leiavoia

1
@lev, bu doğru ve OLMALIDIR !!! BEğer gelecekteki sütunlara sahip olmak isteyip istemediğinizi bilmiyorsanız (bunlar meta veri sütunları veya belirli bir ekran için geçerli olmayan sütunlar olabilir). Yapmazsın; İhtiyacınız olandan daha fazla geri dönerek performansa zarar vermek istiyorsanız (iç birleşiminiz olduğunda% 100 doğru) select * 'in neden bir SQL antipattern olduğu hakkında biraz okuma yapmanızı öneririm.
HLGEM

26
OP, 50'den fazla sütun olduğunu belirtir, bu nedenle bu oldukça pratik değildir.
augurar

1
@HLGEM Gerçekten değil, bunlardan biri hariç her yeni sütun eklediğimde sorguyu sürdürmeden tüm sütunları seçmek istedim ve bu benim durumumda işe yaramaz. Ama yine de Sean O'nun çözümünü kendim için uyguladım
OverCoder

26

Bir alanın değerini dışlamak istiyorsanız, örneğin güvenlikle ilgili endişeler / hassas bilgiler için, bu sütunu boş olarak alabilirsiniz.

Örneğin

SELECT *, NULL AS salary FROM users

13
Neden? Çalışmıyor. Bir sütun maaşınız varsa, bu sorgu yalnızca biri boş ve diğeri gerçek maaşlarla dolu iki sütun içeren sonuçlarla sonuçlanır.
Myforwik

4
@Myforwik Bu sorgu gerçekten ikinci bir salarysütun ekler . Ancak * işaretinden sonra alındığı için orijinalin üzerine yazar. Güzel değil, ama işe yarıyor.
Sean O

67
SQL, sonuç kümesinde her zaman yinelenen sütun adlarına izin verdi. Bunun çalışmasını istiyorsanız, çiftleri desteklemeyen ve son dupe'ye öncelik veren bir istemci uygulamasıyla çalıştırmanız gerekir . Resmi komut satırı istemcisi çiftleri destekler. HeidiSQL de onları destekliyor. SQL Fiddle değil, ilk dupe görüntüler , son değil. Özetle: bu işe yaramıyor .
Álvaro González

9
Tabii ki çalışmıyor. Bu, cevaplarınızı neden mysql ile konuşan kütüphaneler yerine mysql'de test etmeniz gerektiğinin harika bir örneğidir.
Myforwik

8
@SeanO, @ Alastair, @ Herkes, Geçersiz Kılmaz . Sunucu yine de hassas verileri döndürür.
Pacerier

22

Bildiğim kadarıyla, yok. Gibi bir şey yapabilirsiniz:

SELECT col1, col2, col3, col4 FROM tbl

ve manuel olarak istediğiniz sütunları seçin. Ancak, çok sayıda sütun istiyorsanız, yalnızca aşağıdakileri yapmak isteyebilirsiniz:

SELECT * FROM tbl 

ve istemediğinizi görmezden gelin.

Sizin durumunuzda şunu öneririm:

SELECT * FROM tbl

yalnızca birkaç sütun istemiyorsanız. Yalnızca dört sütun istiyorsanız, o zaman:

SELECT col3, col6, col45, col 52 FROM tbl

iyi olurdu, ancak 50 sütun istiyorsanız, sorguyu yapan herhangi bir kodun okunması zorlaşır (çok mu?).


3
Seç * her zaman kötü bir seçimdir. Tavsiye etmeyin. Neden bir SQl Antipattern olduğunu okuyun.
HLGEM

18

@Mahomedalid ve @Junaid'in çözümlerini denerken bir sorun buldum. Bu yüzden paylaşmayı düşündüm. Sütun adında check-in gibi boşluk veya kısa çizgi varsa, sorgu başarısız olur. Basit bir çözüm, sütun adlarının çevresinde ters tıklamayı kullanmaktır. Değiştirilen sorgu aşağıda

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;

11

Seçmek istemediğiniz sütunda büyük miktarda veri varsa ve hız sorunları nedeniyle eklemek istemediyseniz ve diğer sütunları sık sık seçtiyseniz, yeni bir tablo oluşturmanızı öneririm genellikle seçmediğiniz alanlardan birini orijinal tablonun anahtarıyla seçin ve alanı orijinal tablodan kaldırın. Bu ekstra alan gerçekten gerekli olduğunda tablolara katılın.



8

Benim asıl sorun tabloları birleştirirken olsun birçok sütun. Bu, sorunuzun cevabı olmasa da ( bir tablodan belirli sütunlar hariç tümü nasıl seçilir ), yalnızca belirtmek yerine, belirli bir tablodaki tüm sütunları almayı belirtebileceğinizi belirtmek gerekir.table. .

Bunun nasıl yararlı olabileceğine dair bir örnek:

kullanıcıları seç. *, telefon olarak phone.meta_value, posta kodu olarak meta_value

kullanıcılardan

user_meta'ya telefon olarak katıl
açık ((users.user_id = phone.user_id) AND (phone.meta_key = 'telefon'))

kullanıcı_meta'ya posta kodu olarak katıl
açık ((users.user_id = zipcode.user_id) AND (zipcode.meta_key = 'zipcode'))

Sonuç, kullanıcılar tablosundaki tüm sütunlar ve meta tablodan birleştirilen iki ek sütundur.


2
teşekkür ederim, ilk tablonun tüm sütunlarını seçmem gerekiyor ve katılmadan ikinci tablodan sadece bir alan ve cevabınız bana yardımcı oldu.
mohammad falahat

5

@MahomedalidYorumdan haberdar edilen bu gerçeğin yanı sıra cevabı beğendim @Bill Karwin. Ortaya çıkan olası sorun @Jan Koritak, bununla yüzleştiğim için doğrudur, ancak bunun için bir hile buldum ve sadece sorunla karşılaşan herkes için burada paylaşmak istiyorum.

REPLACE işlevini aşağıdaki gibi Prepared ifadesinin alt sorgusundaki where yan tümcesiyle değiştirebiliriz:

Tablo ve sütun adımı kullanma

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;

Yani, bu sadece alanını dışlamak için gidiyor idamacompany_id


4

Tüm sütunları sorgulasanız bile sorguladığınız sütunları belirtmek iyi bir uygulamadır.

Bu yüzden ifadede her bir sütunun adını yazmanızı öneririm (istemediğiniz hariç).

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

FROM table

Kod ile bir sözleşme gibi davranır ve sorguya bakarken, tablonun şemasına bakmadan ondan hangi verileri çıkarabileceğinizi tam olarak bilirsiniz.
mbillard

6
@kodecraft: Aynı türden bir işlevden her zaman geri dönmek iyi bir uygulamadır (zorunlu olmayan bir dilde çalışsanız bile). Temel olarak sadece En Az Sürpriz Prensibi.
Daniel Pryden

4

Sadece yap

SELECT * FROM table WHERE whatever

Ardından sütunu en sevdiğiniz programlama diline bırakın: php

while (($data = mysql_fetch_array($result, MYSQL_ASSOC)) !== FALSE) {
   unset($data["id"]);
   foreach ($data as $k => $v) { 
      echo"$v,";
   }      
}

6
Hariç tutmak istediğiniz sütun büyük bir BLOB veya başka bir şey olmadığı sürece.
Bill Karwin

1
Boşa giden verilerden kaçınmaya çalışıyorsanız bu kötüdür.
Kristopher Ives

53'ten 1 sütun hiçbir fark yaratmamalıdır. Eğer yaparsa, muhtemelen kötü bir tasarımdır.
Petr Peller

1
SElect * bir SQL antipatternidir ve asla üretim kodunda kullanılmamalıdır.
HLGEM

1
SELECT * 'in üretim kodunda "asla" kullanılmaması gereken bir çeşit anti-desen olduğunu kabul etmiyorum. Tüm sütunlarınızı aldığınızdan çok daha açıktır - aslında tüm alanlar olabilecek ya da olmayabilecek uzun bir sütun listesine çapraz referansla karşılaştırıldığında. Aynı zamanda, çok açık bir şekilde, kodlamak daha hızlıdır. Ve tablonun alanlarının bir görünümdeki veya formdaki alanlara tam olarak karşılık geleceği birçok, birçok durum vardır.
Geoff Kendall

4

Tüm sütunları listelemenin "basit" çözümüne katılıyorum, ancak bu külfetli olabilir ve yazım hataları zaman kaybına neden olabilir. Ben bir sorgu yapıştırma için uygun sütunlarım adları almak için bir işlev "getTableColumns" kullanın. O zaman tek yapmam gereken istemediğim şeyleri silmek.

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;

Sonuç, virgülle ayrılmış bir dize döndürür, örneğin ...

col1, col2, col3, Süt4 ... col53



4

Evet, buradaki tabloya bağlı olarak yüksek G / Ç olabilir, bunun için bulduğum bir çözüm.

SELECT *
INTO #temp
FROM table

ALTER TABLE #temp DROP COlUMN column_name

SELECT *
FROM #temp

Bu, orta büyüklükteki herhangi bir tablo için son derece yavaş olacaktır.
Joel

3

Ben yeterli olmadığını kabul edersiniz Select *başka yerde belirtildiği gibi, gerek yok bu bir, bir BLOB ise, sen o havai sürünme olmasını istemiyoruz.

Gerekli verilerle bir görünüm yaratacağım , o zaman Select *rahat edebilirsiniz - veritabanı yazılımı bunları destekliyorsa. Aksi takdirde, büyük verileri başka bir tabloya koyun.


3

İlk başta düzenli ifadeler kullanabileceğinizi düşündüm, ancak MYSQL belgelerini okurken yapamayacağınız anlaşılıyor. Ben olsaydım, almak istediğiniz sütunların bir listesini oluşturmak için başka bir dil (PHP gibi) kullanırdım, onu bir dize olarak saklar ve sonra SQL'i oluşturmak için kullanırdım.


3

Bunu da istedim, bunun yerine bir işlev oluşturdum.

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

Nasıl çalışır, tabloyu, ardından istemediğiniz bir sütunu veya bir dizide olduğu gibi girmeniz gerekir: dizi ("id", "name", "whatevercolumn")

Yani seçimde şöyle kullanabilirsiniz:

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

veya

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

3

@ Mahomedalid'in cevabına katılıyorum, ancak hazırlanmış bir ifade gibi bir şey yapmak istemedim ve tüm alanları yazmak istemedim, bu yüzden sahip olduğum şey aptalca bir çözümdü.

Phpmyadmin-> sql-> select içindeki tabloya gidin, sorguyu atar: kopyala, değiştir ve bitti! :)


2

Thomas'ın cevap kabul ederken (1;)) ben seni o sütunu varsayıyoruz bu ihtar eklemek istiyorum yok neredeyse hiç verileri içerir istiyorum. Çok miktarda metin, xml veya ikili blob içeriyorsa, her sütunu ayrı ayrı seçmek için zaman ayırın. Performansınız aksini çekecektir. Şerefe!


2

Mahomedalid tarafından gönderilen cevabın küçük bir sorunu var:

İç değiştirme fonksiyon kodu " <columns_to_delete>," ile "" yerine geçiyordu, eğer değiştirilecek alan, sonuncusu char virgülüne sahip olmadığından ve " dize.

Teklifim:

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>');

Değiştirilmesi <table>, <database>ve '

Kaldırılan sütun yerine "FIELD_REMOVED" dizesi ile değiştirilir, çünkü benim durumumda bu güvenli bellek çalışıyordum çalışıyordu. (Kaldırdığım alan 1 MB civarında bir BLOB)


2

@Mahomedalid cevabına dayanarak, "mysql'de bazıları hariç tüm sütunları seç" i desteklemek için bazı iyileştirmeler yaptım

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;

Çok fazla kömürünüz varsa, group_concat_max_len öğesini değiştirmek için bu sql'yi kullanın

SET @@group_concat_max_len = 2048;

2

Belki de Jan Koritak'ın işaret ettiği tutarsızlığa bir çözümüm olabilir

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' );

Tablo:

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

================================

Sorgu Sonucu:

'SELECT name_eid,sal FROM employee'

1

Her zaman aynı sütunsa, içinde olmayan bir görünüm oluşturabilirsiniz.

Aksi takdirde, hayır sanmıyorum.


1

Ürettiği SQL'i beğenirseniz ve değerlendirirseniz SQL oluşturmak için SQL kullanabilirsiniz. Bu, sütun şemasını bilgi şemasından ayıkladığı için genel bir çözümdür. Unix komut satırından bir örnek.

ikame

  • Mysql komutunuzla MYSQL
  • Tablo adıyla TABLO
  • Hariç tutulan alan adıyla 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

Sütun listesini bu sütunu hariç tutarak oluşturmak için sütun adlarını yalnızca bu şekilde yalnızca bir kez ayıklamanız ve yalnızca oluşturduğunuz sorguyu kullanmanız gerekir.

Yani şöyle bir şey:

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)

Artık $column_listdizeyi, oluşturduğunuz sorgularda yeniden kullanabilirsiniz .


1

Bu sorunu çözmek için, özellikle kaldırılacak az sayıda sütununuz varsa, başka bir bakış açısı eklemek istiyorum.

Sizin için select deyimini oluşturmak amacıyla MySQL Workbench gibi bir DB aracı kullanabilirsiniz , bu nedenle oluşturulan deyim için bu sütunları el ile kaldırmanız ve SQL komut dosyanıza kopyalamanız yeterlidir.

MySQL Workbench'te bunu üretmenin yolu:

Tabloya sağ tıklayın -> Sql Editor'e gönder -> Tüm Deyimi Seç.


1

Kabul edilen cevabın bazı eksiklikleri vardır.

  • Tablo veya sütun adlarının ters çentik gerektirdiği yerde başarısız olur
  • Atlamak istediğiniz sütun listede sonuncuysa başarısız olur
  • Gereksiz ve gereksiz olan tablo adının iki kez (bir kez select için ve diğeri sorgu metni için) listelenmesini gerektirir
  • Potansiyel olarak sütun adlarını yanlış sırada döndürebilir

Tüm bu sorunlar sadece SEPARATORsizin için backticks ekleyerek GROUP_CONCATve WHEREyerine bir koşul kullanarak aşılabilir REPLACE(). Benim amacım için (ve diğerlerinin hayal ediyorum ') sütun isimlerinin tablonun kendisinde göründükleri sırayla döndürülmesini istedim. Bunu başarmak için burada işlevin ORDER BYiçinde açık bir madde kullanıyoruz GROUP_CONCAT():

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';

0

Bir önerim var ama bir çözümüm yok. Sütunlarınızdan bazılarında daha büyük veri kümeleri varsa, aşağıdakileri denemelisiniz

SELECT *, LEFT(col1, 0) AS col1, LEFT(col2, 0) as col2 FROM table

-1

Bunun için bir cevap atma oldukça geç Im, bu her zaman yaptım şekilde koydu ve açıkçası, onun 100 kat daha iyi ve en iyi cevap daha temiz, ben sadece biri göreceksiniz umuyoruz. Ve yararlı bul

    //create an array, we will call it here. 
    $here = array();
    //create an SQL query in order to get all of the column names
    $SQL = "SHOW COLUMNS FROM Table";
        //put all of the column names in the array
        foreach($conn->query($SQL) as $row) {
            $here[] = $row[0];
        }
    //now search through the array containing the column names for the name of the column, in this case i used the common ID field as an example
    $key = array_search('ID', $here);
    //now delete the entry
    unset($here[$key]);

Belki temiz, ama soruya cevap vermez: php hakkında soru sormadı ve bir select deyimi veya ne istediğinin bir sonucunu vermiyorsunuz, sadece istediği sütunları içeren bir php dizisi vermiyorsunuz.
gou1

2
-1. Bu SQL kodu değildir ve burada herhangi bir SELECTifade yoktur ; kelime bir kez bile gerçekleşmez.
Frungi

Bu sadece (a) PHP ile SQL'den daha rahat olduğunuz veya (b) okunabilirlik için kodunuzu birden fazla satıra yaymayı sevdiğiniz ölçüde daha temizdir. (B) noktasını kabul ediyorum. Yaklaşımınız da daha az performans gösterecektir, ancak birçok kullanım durumunda fark küçük olacaktır. Sorunuzla ilgili diğer yorumlara da bakın. Bağırmaya değmez, bu yüzden orijinal yorumdan uygunsuz yorumunuzu kaldırmanızı öneririz.
mc0e

-5

Select * bir SQL antipatternidir. Üretim kodunda aşağıdakiler dahil birçok nedenden dolayı kullanılmamalıdır:

İşlenmesi biraz daha uzun sürer. İşler milyonlarca kez çalıştırıldığında, bu küçük bitler önemli olabilir. Yavaşlığın bu tür özensiz kodlamadan kaynaklandığı yavaş bir veritabanı performans ayarı için en zor türdür.

Muhtemelen gerekenden daha fazla veri gönderiyorsunuz demektir, bu da hem sunucu hem de ağ darboğazlarına neden olur. Dahili bir birleşiminiz varsa, ihtiyacınız olandan daha fazla veri gönderme şansı% 100'dür.

Özellikle her yerde görünmesini istemediğiniz yeni sütunlar eklediğinizde bakım sorunlarına neden olur. Ayrıca, yeni bir sütununuz varsa, bu sütunla ne yapacağınızı belirlemek için arayüze bir şeyler yapmanız gerekebilir.

(Bu SQl sunucusunda doğru olduğunu biliyorum, mysql doğru olabilir veya olmayabilir) görünümlerini kırabilir.

Birisi tabloları sütunlarla farklı bir sırayla yeniden oluşturacak kadar aptalsa (yapmamalısınız, ancak her zaman olur), her türlü kod kırılabilir. Örneğin, aniden şehri belirtmeksizin adres_3 alanı alanına koyduğunuzda, bir eki özellikle kodlayın, veritabanı yalnızca sütunların sırasına göre gidebilir. Bu, veri türleri değiştiğinde yeterince kötüdür, ancak değiştirilen sütunlar aynı veri türüne sahip olduğunda daha da kötüleşir, bazen temizlemek için bir karmaşa olan kötü verileri eklemek için gidebilirsiniz. Veri bütünlüğüne önem vermelisiniz.

Bir kesici uçta kullanılırsa, bir tabloya yeni bir sütun eklenirken diğerine eklenmezse kesici uç kırılır.

Tetikleyicileri kırabilir. Tetikleyici sorunların teşhis edilmesi zor olabilir.

Tüm bunları sütun adlarına eklemek için gereken süreye karşı ekleyin (heck bile sütun adlarını sürüklemenizi sağlayan bir arayüze sahip olabilir (SQL Server'da yaptığımı biliyorum, bir şekilde Bu mysql sorguları yazmak için kullandığınız bazı araçtır.) Bakalım, "Bakım sorunlarına neden olabilir, performans sorunlarına neden olabilir ve veri bütünlüğü sorunlarına neden olabilir, ama hey beş dakika dev zaman kazandım." istediğiniz belirli sütunlarda.

Ayrıca bu kitabı okumanızı da öneririm: http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers-ebook/dp/B00A376BB2/ref=sr_1_1?s=digital-text&ie=UTF8&qid=1389896688&sr=1- 1 ve anahtar sözcükler = sQL + antipatterns

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.