我有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
答案 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)
如果我的请求正确无误,那么您在选择的每个项目的规格表中都有一套规格?
如果是这种情况,您有几个选择:
获取一个查询中的所有内容,获取每个项目的多个记录(每个图像/ spec /等一行),然后在代码中对此进行排序(非常难看)
使用子查询和group concat
您目前正在处理图像的规范(我认为这也很混乱,在您的规范中设置的键值对设置中更是如此。< / p>
多次调用数据库以在代码中构建对象&lt; - 如果我正确猜测您的数据模型,我认为您应该如何处理它。
我假设你有一个除了标准项目字段之外的项目:
您尝试创建的东西与购物网站不同?
在你的鞋子里我会有几个单独的查询(伪代码):
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
}
如果关注的是减少数据库调用并在代码中合并此信息(即您正在获取数千个项目),那么您最终会执行类似联接的操作,但是要获取(例如)所有项目的图像感兴趣的是一个查询并将它们映射到代码中的项目。