2013-03-19 25 views
5

Sütun isimlerini seçmek istiyorum ancak tablo yapısını önceden bilmiyorum ve değişebilir, bu yüzden sütun deyimleriyle select deyimini kodlayamıyorum. Ayrıca her sütunu seçmek istemiyorum. Bunu yapmanın kolay yolu var mı?Sütun adlarını dinamik olarak mySQL içinde seçme

Düşüncelerim, bu iki sorgunun bir bileşimi olsa da, SQL'm o kadar iyi değil.

SHOW COLUMNS FROM table_name; 
SELECT * FROM table_name; 

Bir alt seçim kullanmayı denedim, ancak çalışmadı. Hiçbir şey,

SELECT (SELECT column_name 
     FROM information_schema.columns 
     WHERE table_name ='table_name') 
FROM table_name; 

Belki katılmak yapmanız gereken sadece sonuç alamıyorsanız bir hata alamadım ne gibi görünüyor? .. Neyse herhangi bir yardım çok iyi olurdu, teşekkürler

+4

Tablo yapısının sürekli olarak değişmesi garip görünüyor, bu tasarım kusuru gibi görünüyor. Mevcut yapınızı gönderebilir veya tablolarınıza daha fazla bağlam sağlayabilir misiniz? – Taryn

+0

Sürekli değişmiyor. Ancak, tabloların nihai yapısı henüz taşa yerleştirilmemiş ve bu yüzden gelecekte olabilecek değişikliklere uyum sağlayacak kadar akıllı bir sistem kurmaya çalışıyorum. Sütun isimlerini önceden bilmiyorum. Bunu PHP'de 2 ayrı sorgu ile yapabilirdim, ancak veritabanı katmanında da yapabilirim. Sütun isimlerini alabileceğimi düşünüyordum, daha sonra tabloyu sorgulamak için bu verileri kullan ve temel olarak dinamik bir seçim deyimi oluştur. – TheSnooker

+0

Bunu dinamik SQL ile yapabilirsiniz (etkili bir şekilde iki sorgu olacaktır), ancak tüm sütunları istemiyorsanız, meta verilerden sütunların seçilmesiyle ilgili ölçütlerin bir sütun dahil olmak üzere seçilmesi için sorgunuzu kodlamanız gerekir. (ve istediğiniz herhangi bir özel sipariş). Ancak, meta verilere ilişkin bir sorgunun sonuçlarını doğrudan seçim sorgusu için belirli bir listeye dönüştürebilirsiniz. –

cevap

2

bu SQLFiddle deneyin :

CREATE TABLE atable (
    prefix1 VARCHAR(10) 
    ,prefix2 VARCHAR(10) 
    ,notprefix3 INT 
    ,notprefix4 INT 
); 

INSERT INTO atable VALUES ('qwer qwer', 'qwerqwer', 1, 1); 
INSERT INTO atable VALUES ('qwer qwer', 'asdfaasd', 1, 1); 
INSERT INTO atable VALUES ('qwer qwer', 'qrt vbb', 1, 1); 
INSERT INTO atable VALUES ('qwer qwer', 'sdfg sdg', 1, 1); 

SELECT CONCAT('SELECT ', GROUP_CONCAT(c.COLUMN_NAME), ' FROM atable;') 
INTO @query 
FROM INFORMATION_SCHEMA.COLUMNS c 
WHERE c.TABLE_NAME = 'atable' 
    AND c.COLUMN_NAME LIKE 'prefix%' 
ORDER BY c.ORDINAL_POSITION; 

PREPARE stmt FROM @query; 

EXECUTE stmt; 

bazı konular:

Sen sonuç sette ORDER BY çeşit istiyorum olasılıkla.

Birleştirmeler ve nesneler açısından yapabilecekleriniz için bir sınır vardır.

Doğrulamayı, testin kaçırılması olasılığının daha yüksek olduğu çalışma zamanına taşırsınız.

Şema değişikliklerini kolayca halledebileceğinizi umuyorsunuz. Bu teknik, yalnızca tahmin edebileceğiniz belirli bir türdeki şema değişikliklerini ele alacaktır ve başkaları muhtemelen bu kodu muhtemelen değiştirmek zorunda kalacaktır.

+0

Evet, ne demek istediğini anlıyorum. Bazı sütunları sadece tanımlayabildiğim ve değiştirebileceğim bir dizi kurala dayanan bir tür akıllı sorgu sistemi oluşturabileceğimi ümit ettim. Bu yaklaşıma daha çok baktığımda, muhtemelen daha fazla karmaşıklık yaratacağını ve sonra değerinin daha yüksek olacağını fark ettim. Hiç CONCAT kullanmayı düşünmedim, akıllıca. – TheSnooker

+0

@ TheSnooker kod üretme ve dinamik SQL sistemleri korumak için daha kolay bir yer vardır. Aslında, kod oluşturma ve veritabanı kodu sağlık izleme için meta verileri kullanmaya ilişkin bir sunumum var. Ancak, gelecekte bu senaryoyu kanıtlamak için daha iyi bir yer olduğunu düşünmüyorum. –