1

我有 4 张桌子。它们是客户、物品、图像和规格。目标是将这 4 个表连接在一起。现在我正在组合这样的项目和图像:

SELECT item_id, item_name, item_price,images_id, GROUP_CONCAT(images_fullname) AS images, images_itemid
FROM items
LEFT OUTER JOIN images ON item_id=images_itemid

但是加入第三张桌子规格的最佳方式是什么?specs 包含:spec_id、spec_itemid、spec_name、spec_value(specs 是特定项目的规范)。我想最好的做法是不要再复制一次 Left Outer Joine?

我需要的布局如下:

Item name 1
image1, image2, image 3 (is working now with concat)
spec_name, spec_value
spec_name, spec_value
spec_name, spec_value

Item name 2
image1, image2, image 3 (is working now with concat)
spec_name, spec_value
spec_name, spec_value
spec_name, spec_value
4

2 回答 2

3

仅当连接表可以为空时,才需要外部连接。目前尚不清楚这里是否是这种情况,但请记住这一点。

SELECT
    various_columns
FROM
    items
    LEFT JOIN images ON item_id = images_itemid
    LEFT JOIN specs ON item_id = spec_itemid

添加另一个联接没有错;您仍在加入关键列(我假设)。

于 2013-02-15T01:47:42.533 回答
1

如果我正确理解了您的要求,那么您选择的每个项目的规格表中都有一组规格吗?

如果是这种情况,您有几个选择:

  1. 在单个查询中获取所有内容,获取每个项目的多个记录(每个图像/规范/等一行),然后在代码中对其进行排序(非常难看)

  2. 使用子查询和group concat您当前正在处理图像的规范(我认为这也很混乱,并且在您为规范设置的键值对设置中更是如此。

  3. 多次调用数据库以在代码中构建您的对象<-如果我正确猜测您的数据模型,这就是我认为您应该处理它的方式。

我假设您有一个项目,除了标准项目字段之外:

  1. 一些图片
  2. 几个指定项目特定属性的键值对

您尝试创建的东西与购物网站没有什么不同?

在你的鞋子里,我会有几个单独的查询来做到这一点(伪代码):

 items = SELECT item_id, item_name, item_price,images_id FROM items

然后在这些项目的 foreach 循环中,如果使用 OO 语言,您将在循环中的 Item 对象中填充列表:

foreach (item in items) {
   SELECT images_fullname, images_itemid FROM images WHERE item_id=images_itemid;
   // put into a list of type image in the item object
   SELECT * FROM specs WHERE item_id=spec_itemid;
   // put into a list of type spec in the item object 
}

如果关注的是减少数据库调用并将此信息合并到代码中(即您要获取数千个项目),那么您最终会执行类似联接的操作,但要获取(例如)您感兴趣的所有项目的图像使用一个查询并将它们映射到代码中的项目。

于 2013-02-15T02:40:47.720 回答