【问题标题】:Outer Cross Join?外交叉连接?
【发布时间】:2009-07-07 18:55:33
【问题描述】:

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

images 表包含多个具有相同 imgId 的记录,这同样适用于 productcolors,其中几个 colorIds 可以/将具有相同的值。 images 表中也可能没有记录(例如,如果产品表中的 imgId = -1)。这意味着产品没有颜色。现在,当我进行此查询并且 images 表或 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

【问题讨论】:

  • 您希望查看的数据样本会有所帮助。
  • 很难理解你想要什么。我认为您的数据模型有点误导。即使不是,交叉连接也有 90% 不是您想要的。在继续调查交叉连接之前,请考虑发布表的模式。同样,很可能不是您想要的。
  • “表现得像左外连接。”那为什么不使用左外连接呢?
  • @Shannon:表现得像左外连接和交叉连接*

标签: php sql mysql loops


【解决方案1】:

我建议重新设计产品颜色的存储方式,将其变成如下内容:

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)

【讨论】:

  • 谢谢!我想我基本上可以对图像做同样的事情。
猜你喜欢
  • 1970-01-01
  • 2011-02-12
  • 2013-05-01
  • 2011-03-14
  • 2020-04-27
  • 2013-07-11
  • 2010-10-17
  • 2012-12-31
  • 1970-01-01
相关资源
最近更新 更多