2012-10-31 17 views
25

numaralı tablodan nasıl alınacağı sorusuyla, oldukça korkunç bir eski veritabanı/kod tabanı analiz ediyorum, sorguları birleştirerek birleştirerek sunucu yükünü azaltmaya çalışıyorum (genellikle bir e-posta uyarısı cron işi dahil) milyonlarca ayrı sorgudan daha iyi çağırır).Bir birleştirmede, tablodaki tüm sütun adlarının

SELECT * FROM 
class_alerts_holding ah 
INNER JOIN class_listings l ON l.id = ah.lid 
INNER JOIN class_users u ON u.id = ah.uid 
LEFT JOIN class_prodimages pi ON pi.pid = ah.lid 

Bu 120 sütun tükürür ...

aid | id | lid | uid | oid | catName | searchtext | alertfreq | listType | id | owner | title | section | shortDescription | description | featured | price | display | hitcount | dateadded | expiration | url | notified | searchcount | repliedcount | pBold | pHighlighted | notes | ... 

Ben tabloyla sonucu sütunları öneki eğer o harika olurdu yeni sorgular nasıl oluşturulduğuna dair analizimi yardımcı olmak onlar JOIN örneğinden geldi

class_alerts_holding.aid | class_alerts_holding.id | class_listings.lid | ... 

Bunu başarmanın bir yolu var mı?

+1

Ben tek olasılık dışarı yazıyor korkuyorum/SELECT' ifadesini manuel olarak oluşturmak –

+1

Uzun bir süre için Google arama yapmak için bana bir neden verdiniz. Bu konuda geçmişle de ilgilenmekteydim, ancak bunu yapmak için gerçekten herhangi bir yöntem bulamadım –

+0

Olası çoğaltması [SQL select join: tüm sütunları 'önek' olarak atamak mümkün mü? \ * '?] (http://stackoverflow.com/questions/329931/sql-select-join-is-it-possible-to-prefix-all-columns-as-prefix) –

cevap

18

Sen

select ah.*, l.*, u.*, pi.* from ... 

sonra sütunlar en az bir tablo tarafından sipariş döndü edilecektir olabilir.

sütun her iki takım arasında daha iyi bir ayrım için, ayrıca böyle "sınırlayıcı" sütunlarını ekleyebilirsiniz: (., Gereksiz olarak açık takma adları kaldırmak yorumları görmek için Düzenlendi)

select ah.*, ':', l.*, ':', u.*, ':', pi.* from ... 

+1

* * * * sorgularını analiz ederken sık sık yaptığım şeyleri ekleyerek önerinize "genişleyen" özgürlüğünü attım. Cevabınızda yer olmadığını düşünüyorsanız, değişiklikimi geri almaktan çekinmeyin. –

+1

+ 1 Sınırlayıcılar, siparişin uygulanmasının yanı sıra kesinlikle yardımcı olurlar. Sütun siparişi zaten JOIN'lerin sırasına göre görünse de (MySQL 5.5.25). –

+0

@AndriyM Sorguyu hafifletmek için sadece bir not: “AS” olmadan aynı sonucu aldım. 'ah seçin *, ':', l. *, ':', ...' –

32

Sorgunuzda alanların adını ve onlara adlar verebilir: O çok alanı varsa

SELECT  ah.whateverfield1 AS 'ah_field1', 
      ah.whateverfield2 AS 'ah_field2', 
      l.whateverfield3 AS 'l.field3', 
      [....] 
FROM  class_alerts_holding ah 
INNER JOIN class_listings l ON l.id = ah.lid 
INNER JOIN class_users u ON u.id = ah.uid 
LEFT JOIN class_prodimages pi ON pi.pid = ah.lid 

Onun işin biraz elle kurmak, ancak bu sorguyla bu kolaylaştırabilirsiniz .. .

SHOW FULL FIELDS FROM your_table_name; 

... ve iyi bir metin editörü ve & kopyalayıp yapıştırarak.

+8

... ve kabul edilen cevabın aksine, bu aslında orijinal soruya cevap veriyor! – nurdglaw

+7

Yani tablonun gitmesinin bir yolu yok. * tablo olarak ve tablodaki tüm sütunlar tablodan döndü.columnName? – James111

+0

Düzenleyiciniz regex bulgusunu destekliyorsa ve değiştirin, sonra her bir sütun adını bu desenle bulabilirsiniz -> (?) (. *?), ve ile değiştirin pattern -> \ 1PREF. \ 2 AS PREF_ \ 2, – Teddy

8

Sütunları dinamik olarak adlandırmanın yolu, information_schema'ya başvuran hazırlanmış bir deyim oluşturmaktır. Bu size aradığınız sonuçları verecektir.

SET @sql = NULL; 
SELECT CONCAT(
    'SELECT ',GROUP_CONCAT(c.TABLE_NAME,'.',c.COLUMN_NAME,' AS `',c.TABLE_NAME,'.',c.COLUMN_NAME,'`'),' 
    FROM class_alerts_holding 
    INNER JOIN class_listings ON class_listings.id = class_alerts_holding.lid 
    INNER JOIN class_users ON class_users.id = class_alerts_holding.uid 
    LEFT JOIN class_prodimages ON class_prodimages.pid = class_alerts_holding.lid' 
) 
INTO @sql 
FROM INFORMATION_SCHEMA.COLUMNS c 
WHERE c.TABLE_NAME IN ('class_alerts_holding','class_listings', 
         'class_users','class_prodimages');  
PREPARE sql_statement FROM @sql; 
EXECUTE sql_statement; 

GROUP_CONCAT() fonksiyonu böylece tablolardaki sütun sayısı bağlı olarak, hazırlanmış deyimi üretmek için bu sınırı yükseltmek gerekebilir, 1024 karakter varsayılan sınırı vardır.

SET SESSION group_concat_max_len = 1000000; 

Bu komut gerekirse grup komutu sınırını yükseltecektir. - koljaTM ve AndriyM tarafından önerilen çözüm dayanarak

+1

Bunun çıktısına bir örnek verebilir misiniz? –

+1

Elbette, işte bu örnekte bir keman var, http://sqlfiddle.com/#!9/e99bf2/10. Bir araya getirdiğinizde, tablo takma adlarını çıkarmanız ve AS ifadelerini içermeniz gerektiğini gördüm, bu yüzden bunları dahil etmek üzere düzenledim. Fiddle, sütun adlarını nasıl görüntülediği konusunda garip görünüyor. Örneğin, yalnızca ilk sütun için bir kimlik gösterir. Ancak başka herhangi bir müşteride, belirtilen class_alerts_holding.id değerini göreceksiniz. –

+0

Aşağı oy için özür dilerim, birkaç gün önce sayfa boyunca kaydırırken olmuş olmalı :( → Cevabınız düzenlenene kadar o oyu değiştiremezsiniz –

2

, belki daha da iyi bir çözüm bu gibi sorgu yazmaktır:

select 
    '--TABLE_AAA:--', TABLE_AAA.*, 
    '--TABLE_BBB:--', TABLE_BBB.*, 
    '--TABLE_CCC:--', TABLE_CCC.*, 
    '--TABLE_DDD:--', TABLE_DDD.* 
from ... 

Ne yazık ki bu hala durumlarda yeterince iyi olmadığı zaman bir (veya daha fazla) tabloların ekran genişliğine sığabilecek daha fazla sütun adı içerir.(Bu durumda, ekranınızda 20 sütun görebiliyorsunuz ama hala ekranda görülemeyecekleri tablonun adını görebiliyorsunuz.)

SQL, sütun adlarının otomatik olarak ön eklenmesi için bir yol sağladıysa daha iyi olurdu. tablo adları ile ...

+2

re: ekran genişliği —PostgreSQL ve MySQL kabukları, her bir değerin bir sütun olarak basıldığı bir dikey sonuç moduna sahiptir: değer çifti Postgres: Kabuğun içinde '\ x' yazın, uzatmak için MySQL: sorguyu "\ G" yerine ";" yerine koyun. –

+0

"SQL, sütun adlarını tablo adlarıyla otomatik olarak öneki bir yol sağladıysa daha iyi olurdu" +1 – Teddy

0

@ Alden-w, farklı şemaları

aynı tablo isimlerini karıştırmayın yapmak nereye table_schema koşulu ekleyebilir
WHERE c.TABLE_SCHEMA='YOUR_SCHEMA_NAME' AND c.TABLE_NAME IN (....) 
İlgili konular