Dış Çapraz Katıl?

1 Cevap php

Ben ise döngüler sorguları kullanarak önlemek için çalışıyorum. Bu nedenle ben bir çapraz birleştirme kullanmalısınız sonuca geldik. Bu örneği ele alalım:

SELECT * FROM products 
CROSS JOIN images USING (imgId) 
CROSS JOIN productcolors ON colorsId = colorId
WHERE productId = 1

İki satır (aşağıda tablo yapısı) döndürmesi gerekir:

imgId | productId | colorId  | imgSrc      | colorName
1       1           1          img1_0.png    copper

imgId | productId | colorId  | imgSrc      | colorName
1       1           1          img1_0.png    slate

ve ne zaman productId'den = 2 tek satır dönmek gerekir:

imgId | productId | colorId  | imgSrc      | colorName
null    2          -1          null          null

Görüntüler tablo aynı imgId birkaç colorIds / aynı değere sahip olacaktır olabilir productcolors için aynı applys ile birden fazla kayıt içermektedir. Ayrıca görüntüleri tabloda kayıt yok olabilir (eğer imgId örneğin = -1 ürünler tablosunda). Bu bir ürün yok renkleri vardır anlamına gelir. Şimdi, ben bu sorguyu ve görüntüleri tablo yapmak veya productcolors tablo imgId veya ColorID için hiçbir kayıt içerdiğinde sorgu hiçbir sonuç dönecektir. Ben bir sol dış gibi davranmak, boş değerler yerine bir şey değil dönen içeren satırdaki alanları gibi katılmak ve çapraz bir araya olacaktır.

Belki yerine benim whileloop sorguları olmalıdır? Bu sorunu yaklaşım için başka bir yolu olabilir mi?

EDIT: Benim masalar

products:
productId | colorsId | imgId
1           1          1
2          -1         -1      //product 2 has no images nor colors

productcolors:
colorId | colorName
1         copper
1         slate

images:
imgId | imgSrc
1       img1_0.png

1 Cevap

Ben böyle bir şeye dönüştürüyor, ürün renkleri depolandığı şekilde retooling tavsiye ederim:

products:
productId | imgId | productName
1           1       rock
2           null    roll

productcolors:
productId | colorId
1           1
1           2

colors:
colorId   | colorName
1           copper
2           slate

images:
imgId | imgSrc
1       img1_0.png

Yukarıda productcolors çok-çok tablo katılmak bir olduğunu.

Bu aynı zamanda sadece her ürün için bir imaja sahip olduğunu varsayar, ve yalnız bu tabloyu bırakır.

Onların renkleri de dahil olmak üzere ürünlerin bir listesini almak için:

SELECT p.productId, p.productName, c.colorId, c.colorName, i.imgSrc
FROM products p
LEFT JOIN images i USING (imgId)
LEFT JOIN productcolors pc USING(productId)
LEFT JOIN color c USING(colorId)