mysql主表关联扩展表(一对多)如何实现搜索

因为项目需要主表goods表只存了一些基本信息,扩展表goods_ext中用字段key存商品的其他属性,表结构如下:

1.goods表

id goods_name goods_pirce
1 xxx 12
2 xxx 21

2.goods_ext表

goods_id(商品id) key(属性) name(属性名称) value(属性值)
1 level 等级 30
1 money 金币 100
1 address 地址 xxxxx
2 level 等级 50
2 money 金币 1000
2 address 地址 xxxxxx

现在遇到的问题是在列表页进行筛选的时候如果要满足扩展表的多个条件该如何实现?比如我要搜索 level=60 ,money=1000并且价格在10-20之间的的所有商品


可能没有很清楚的描述出我的问题,但希望大家先看懂表结构再回答,看懂表结构就知道我想问的问题,我现在的解决办法如下:

SELECT *
FROM goods
WHERE goods_price >= 10 AND goods_price <= 20 AND goods_id IN (
SELECT g.goods_id
FROM(
SELECT goods_id, COUNT(goods_id) AS num
FROM goods_ext
WHERE (`key` ='money' AND value = 1000) OR (`key` ='level' AND value = 60)
GROUP BY goods_id
HAVING num>=2) AS g
);

由于考虑到效率,不想使用in查询,所以来这里请教大神看看有没有更好的解决办法或者表设计方案

阅读 4.6k
5 个回答

这表设计的不怕被打死吗。。

thinkphp 查询写法
$where['g.preic'] = array('between','10,20');
$where['ge.level'] = 60;
$where['ge.money'] = 1000;
M('goods')
->alias('g')
->join('left join goods_ext ge on ge.goods_id = g.goods_id')
->where($where)
->select();

方法1,使用join
方法2,使用wherein
从goods找出价格在10-20之间的所有goods_id
在goods_ext里wherein,再加上其他条件

没有人回答吗?

这个可以加多一个中间表:
商品表,保存商品基本信息,商品名称,商品编码...
商品属性表,属性名,属性值...
商品--属性中间表,保存商品-属性关联关系;
再有就是尽量保证SQL语句的简洁性;
纯属个人意见啊...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题