2013-03-17 27 views
14

Bir MySQL Veritabanında iki tablom var.MySQL Sütunlar olarak Çoklu Satırlara Katıl

Tablo 1:

ID Name 
1  Jim 
2  Bob 

Tablo 2:

ID Place Race_Number 
1  2nd  1 
1  3rd  2 
1  4th  3 
2  1st  1 
2  2nd  2 
2  2nd  3 

veritabanından satır seçerken, birinci tablo sütun olarak ikinci tablodaki satır katılması için herhangi bir yol yoktur? Şu anda SELECT * FROM Table1 NATURAL JOIN Table2 kullanıyorum.

Bu çıkışlar:

ID Name Place Race_Number 
1 Jim  2nd  1 
1 Jim  3rd  2 
1 Jim  4th  3 
2 Bob  1st  1 
2 Bob  2nd  2 
2 Bob  2nd  3 

Şu benim PHP komut dosyası bu düzenleyip ediyorum bir dizi içerisine sıralamak. Bu bir acıdır, çünkü ID'lere bakmalı ve aynı olup olmadıklarına bakıp buna göre sıralamalıyım. Bunu, PHP'de bir diziye ayırmak zorunda kalmadan MySQL'de bunu yapmanın bir yolu olduğunu hissediyorum. Her bir kimlik için ikinci tabloda sınırsız sayıda giriş olabilir.

sağ MySQL sorgudan istenen sonuçtur: her kimlik için ırkların sınırsız sayıda olabilir çünkü masanın kendilerinde Race1, Race2 vb için sütunlar yapamaz

ID Name Race1 Race2 Race3 
1  Jim  2nd  3rd  4th 
2  Bob  1st  2nd  2nd 

.

Yardımlarınız için teşekkürler!

cevap

28

INNER JOIN ihtiyaçlarınızı karşılayacaktır. MySQL'in PIVOT işlevine sahip olmaması, yine de CASE ve MAX() işlevlerini kullanarak simüle edebilirsiniz. Eğer RACE bilinmeyen numaranız varsa

SELECT a.ID, a.NAME, 
     MAX(CASE WHEN b.Race_Number = 1 THEN b.Place ELSE NULL END) Race1, 
     MAX(CASE WHEN b.Race_Number = 2 THEN b.Place ELSE NULL END) Race2, 
     MAX(CASE WHEN b.Race_Number = 3 THEN b.Place ELSE NULL END) Race3 
FROM Table1 a 
     INNER JOIN Table2 b 
      ON a.ID = b.ID 
GROUP BY a.ID, a.Name 

, o zaman bir DYNAMIC SQL çok daha tercih edilir.

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT('MAX(CASE WHEN b.Race_Number = ', Race_Number, 
     ' THEN b.Place END) AS ', CONCAT('`Race', Race_Number, '`')) 
    ) INTO @sql 
FROM Table2; 

SET @sql = CONCAT('SELECT s.Student_name, ', @sql, ' 
        FROM Table1 a 
        LEFT JOIN Table2 b 
         ON ON a.ID = b.ID 
        GROUP BY a.ID, a.Name'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
+0

Awesome, thank you very much !! –

+2

welcome ': D' –

+0

teşekkürler ... dinamik sql sorgu kısmı benim sorunumu çözmeme yardımcı oldu .. – Lucky

İlgili konular