2012-06-07 14 views
21

değeri olarak başka bir sütun dinamik satır değerlerini seçmek ve yapısını değiştiremez -MySQL (yani aktif hala kullanımda), sütun adları gibi kullanıcı bilgilerinin eski tablo var

id name  value 
------------------------------ 
0  timezone Europe/London 
0  language en 
0  country 45 
0  something x 
1  timezone Europe/Paris 
1  language fr 
1  country 46 

saat dilimi/dili/etc ülke adları sadece örnektir, bunlar değişken olabilir/o sütun sıraları üzerinde benzersiz dışında hiçbir sonlu listesi var

iade ediyorum MySQL uyumlu SQL sorgusu gerek -

id timezone  language country something 
--------------------------------------------------- 
0  Europe/London en   45  x 
1  Europe/Paris fr   46 

Ben MySQL için Pivot tablo işlevselliği hack etrafında stackoverflow çeşitli cevapların tamamını baktı ve benzer ancak bunların hiçbiri aynı tablonun bir sütundan benzersiz satır değerlerinden değişken sütun adı takma adını kullanarak bu davayı maç gibi oldum. Her ne kadar küçük uykum olsa da, her şey biraz bulanıklaşmaya başlıyor, şimdiden özür dilerim.

bulabildiğim en yakın, ad sütundan tüm olası/benzersiz değerler alacağı olan hazır deyimleri https://stackoverflow.com/a/986088/830171 kullanabilir ve CASE WHEN kullanan bir sorgu oluşturmak olacaktır ve/veya aynı tablo sorgularını SELECT veya JOIN alt birden.

Düşünebildiğim alternatifler, bu kullanıcı kimliği için tüm satırları almak ve bunları bir özdevinimli olarak uygulamanın kendisinde işlemek veya adları sonlu bir miktarla sınırlamaya çalışmak ve alt SELECT s/JOIN s. Ancak ikinci seçenek yeni bir isim eklendiğinde ideal değildir, bu sorguyu tekrar gözden geçirmem gerekir.

söyle ben tasarım tarafından bu tür operasyonlarını dönme için yerel destek (geliştiriciler daha ziyade sunum için daha uygun olduğunu hissediyorum yok diğer bazı RDBMS MySQL aksine

+0

gerçekten bu sql' 'ifade edilecek veya tercih ettiğiniz programlama dili ile yeterli işleme sonrası olacaktır gerekiyor mu? De-fungled verilerinize katılmanız gerekiyorsa, o zaman bir görüş/prok numara olabilir. – bluevector

+0

Yeh Şaşkınlığı şimdilik uygulama düzeyinde tutacağım - Bu kullanıcı kimliği için tüm satırları alacağım ve bir ilişkisel dizi içine veri ekleyerek döngü yapacağım. Sadece iyi bir seçenek olduğunu kontrol etmek istedim. Taşınma ve tek seferlik raporlar için SQL yöntemine sahip olmak hala çok kullanışlı. – gingerCodeNinja

cevap

39

belirgin bir şey kaçırdığınızı Lütfen veritabanından, uygulamanızın katmanı).

kesinlikle hazırlanmış deyimi bina, MySQL içinde böyle yönlendirmeleri perfom gerekiyorsa ben muhtemelen sadece MySQL'ın GROUP_CONCAT() işlevi kullanmak istiyorum, daha doğrusu rağmen CASE ile karıştırmasını daha — gitmek yoludur:

SELECT CONCAT(
    'SELECT `table`.id', GROUP_CONCAT(' 
    , `t_', REPLACE(name, '`', '``'), '`.value 
     AS `', REPLACE(name, '`', '``'), '`' 
    SEPARATOR ''), 
' FROM `table` ', GROUP_CONCAT(' 
    LEFT JOIN `table` AS `t_', REPLACE(name, '`', '``'), '` 
      ON `table`.id = `t_', REPLACE(name, '`', '``'), '`.id 
      AND `t_', REPLACE(name, '`', '``'), '`.name = ', QUOTE(name) 
    SEPARATOR ''), 
' GROUP BY `table`.id' 
) INTO @qry FROM (SELECT DISTINCT name FROM `table`) t; 

PREPARE stmt FROM @qry; 
EXECUTE stmt; 

bakın sqlfiddle'da.

GROUP_CONCAT() sonucunun group_concat_max_len değişkeni tarafından sınırlandırıldığını unutmayın (varsayılan değer 1024 bayttır: son derece uzun name değeriniz olmadığı sürece burada olması muhtemel değildir).

+4

vay - bir çaba yazma ve test etme çabalarına gittiğiniz için teşekkürler. Çok takdir edildi. Her zaman bu tür bir sorgulamanın nasıl yapıldığını bilmek istemişimdir ve tahmin ettiğim gibi karmaşık görünüyor. Şimdilik, uygulamadaki dağınıklığı koruyacağım, ancak bu sorgulama, raporlama ve geçişler için hala çok kullanışlı olacaktır. Teşekkürler. – gingerCodeNinja

+0

Çok benzer bir senaryonum var ve mükemmel örneğinizi kullanarak döner sonuçların tam olarak görüntülenmesini sağlıyorum.Ama sonuçta bir tablo oluşturmak istiyorum çünkü ondan bir grafik oluşturmak istiyorum. Pivotlu sonucu bir tabloya depolamak mümkün mü? Ayrıca, Php içinde yürütmek mümkün mü? Kaynak tablom, kullanıcı, tarih, performans ve pivot kullanıcı olarak satır, sütun olarak tarih ve hücre değeri olarak performans. – Sri

+0

Örnek tablom sqlfiddle'a koydum (lütfen bkz. Http://sqlfiddle.com/#!2/06be4/1) – Sri

İlgili konular