我试图避免在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
答案 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)