将表连接在一起Mysql 3次

时间:2013-02-15 01:44:34

标签: mysql sql join

我有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

但是加入第三个表规范的最佳方法是什么? 规范包含:spec_id,spec_itemid,spec_name,spec_value(specs是特定项目的规范)。我想最好的做法是不要再次做一个左外连衣裙的公告吗?

我需要的布局如下:

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

2 个答案:

答案 0 :(得分:3)

仅当连接表可以为null时,才需要外连接。目前尚不清楚这是否属实,但请记住这一点。

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

添加另一个连接没有错;你还在加入一个关键专栏(我假设)。

答案 1 :(得分:1)

如果我的请求正确无误,那么您在选择的每个项目的规格表中都有一套规格?

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

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

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

  3. 多次调用数据库以在代码中构建对象&lt; - 如果我正确猜测您的数据模型,我认为您应该如何处理它。

  4. 我假设你有一个除了标准项目字段之外的项目:

    1. 一些图片
    2. 指定项目特定属性的几个键值对
    3. 您尝试创建的东西与购物网站不同?

      在你的鞋子里我会有几个单独的查询(伪代码):

       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 
      }
      

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