外十字加入?

时间:2009-07-07 18:55:34

标签: php sql mysql loops

我试图避免在while循环中使用查询。因此,我得出结论,我应该使用交叉连接。举个例子:

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

应返回两行(下面的表结构):

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

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

并且当productId = 2时应返回一行:

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

图像表包含多个具有相同imgId的记录,同样适用于productcolors,其中多个colorIds可能/将具有相同的值。图像表中也可能没有记录(如果在产品表中imgId例如= -1)。这意味着产品没有颜色。现在,当我进行此查询并且images table或productcolors表不包含imgId或colorId的记录时,查询将根本不返回任何结果。我希望行中的字段包含空值而不是返回任何内容,表现得像左外连接和交叉连接在一起。

也许我应该在我的whileloop中查询?有没有其他方法可以解决这个问题?

编辑:我的桌子

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 个答案:

答案 0 :(得分:3)

我建议重新设置产品颜色的存储方式,将其变成这样的东西:

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
上面的

productcolors是一个多对多的连接表。

这也假设您每个产品只有一个图像,并且只保留该表。

获取产品清单,包括颜色:

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)