2016-08-09 23 views
5

Üç tablom var: items, junction ve properties. Beş öğe (A'dan E'ye) ve beş özelliğim var (1'den 5'e kadar).Kartezyen Ürünü Birleşim Tablosundan Nasıl Bağlar MySQL'e Katıl

A: 1, 3, 5 
B: 1, 2, 3 
C: 1, 4, 5 
D: 1, 2, 3 
E: 1, 4, 5 

Ben aşağıdaki sorguyu çalıştırdığınızda (bir beklendiği gibi), çok güzel bir onbeş rekor kartezyen ürün almak şöyledir: Kavşak Tablo Via, ben özelliklere atadınız. Yapmak istediğim ne

SELECT I.id, I.item_name, P.property_name FROM scratch.items I 
JOIN scratch.junction J ON J.item_id = I.id 
JOIN scratch.property P ON J.property_id = P.id; 

yüzden bu gibi onları tükürür tek bir alana her öğenin özellik adlarını bitiştirmek geçerli:

Record | item_id | item_name | properties 
---------------------------------------------------------------------------- 
    0 | A  | Item A  | Property 1, Property 3, Property 5 
    1 | B  | Item B  | Property 1, Property 2, Property 3 
    2 | C  | Item C  | Property 1, Property 4, Property 5 
    3 | D  | Item D  | Property 1, Property 2, Property 3 
    4 | E  | Item E  | Property 1, Property 4, Property 5 
---------------------------------------------------------------------------- 

benim yapmacık örnek aksine burada, her öğe herhangi bir sayı olabilir özellikleri (sıfır dahil).

+0

Yani gerçekten tasarruf CSV verilerini bir sütunda. Bunu yapma. Varsa [Bağlantı Tabloları] 'na bakın (http://stackoverflow.com/a/32620163). Normalizasyon, hız, akıl, – Drew

+0

Burada CSV yok. Kavşak Tablosu, diğer iki tablonun PK'larına işaret eden iki FK'den başka bir şey değildir. Bunu yapmaya çalışıyorum çünkü insan tarafından okunabilir bir görünüm oluşturmaya çalışıyorum ve uygulama mantığımdaki birleştirme işlemini yapmak istemiyorum. – Darkly

+0

İnsan tarafından okunabilir görünüm, bir Görünüm'den oluşabilir. 'Find_in_set() 'ile bir araya gelmeden performans almayı beklemediğiniz sürece. Oldukça basmak için group_concat() 'yapmak bir şey. Güzel baskı çıktılarına dayanan verileri almak için iyi ayarlanmış bir db motoru beklemek başka bir şey. – Drew

cevap

3

Böyle group_concat işlevi kullanabilirsiniz:

SELECT I.id, I.item_name, group_concat(P.property_name) as properties 
FROM scratch.items I 
JOIN scratch.junction J ON J.item_id = I.id 
JOIN scratch.property P ON J.property_id = P.id 
group by I.id; 
+0

Mükemmel çözüm, 麦 伟锋. Bu, tam olarak _ _ _ _ _ oldu. – Darkly