2013-02-15 108 views
1

我有4个表。他们是客户,物品,图片&规格。目标是将这4个表加在一起。现在我把这样的项目和图像结合起来:将表连接在一起Mysql 3次

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(规格是特定项目的规格)。我想最好的做法是不要再做一次左派外传的新发行?

我需要的布局如下因素:

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 

的问候,西蒙

回答

3

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

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

添加另一个连接没有任何问题;你还在加入一个关键专栏(我认为)。

+0

在这种情况下,连接的表格图像可以包含空值,这就是为什么我使用OUTER。我需要的是与一个特定产品相关的规格的完整清单。您提供的示例不起作用,它不显示正确的信息:/ – simon 2013-02-15 01:51:34

+0

@SimonDuun请发布您的架构和您正在使用的查询 – 2013-02-15 01:53:13

+0

我发布了我正在使用的查询? :) – simon 2013-02-15 01:54:15

1

如果我正确地处理您的请求,那么您是否在规格表中为您选择的每个项目提供了一组规格?

如果这是你有几个选择的情况下:

  1. 获取一切都在一个单一的查询得到每件(每图像/规格/等一行)的多个记录,然后排序了这一点,在代码(非常丑陋)

  2. 使用子查询和group concat像你正在使用的图像做(我想这也是凌乱,将是更多的是在你有你的功能键 - 值对设定的规格。

  3. 对数据库进行多个调用,以便在代码<中建立对象 - 如果我正确猜测数据模型,我认为您应该如何处理它。

我假设你有除了拥有标准项目领域的项目:

  1. 大量图片
  2. 几个键值对用于指定项目的特定属性

而你试图创建的东西并不像购物网站?

在你的鞋我也有几个单独的查询做这(伪代码):在foreach循环中为这些项目

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

然后,如果使用面向对象的语言,你会填充到你的列表项目对象在循环中。:

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 
} 

如果担心的是减少数据库调用并合并此代码中的信息,(即你获取了成千上万的项目),那么你最终会做类似于你的连接的事情,但是用一个查询获取你感兴趣的所有项目的图像(例如),并将它们映射到代码中的项目。