鍍金池/ 問答/PHP  數(shù)據(jù)庫/ mysql主表關(guān)聯(lián)擴(kuò)展表(一對多)如何實現(xiàn)搜索

mysql主表關(guān)聯(lián)擴(kuò)展表(一對多)如何實現(xiàn)搜索

因為項目需要主表goods表只存了一些基本信息,擴(kuò)展表goods_ext中用字段key存商品的其他屬性,表結(jié)構(gòu)如下:

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

現(xiàn)在遇到的問題是在列表頁進(jìn)行篩選的時候如果要滿足擴(kuò)展表的多個條件該如何實現(xiàn)?比如我要搜索 level=60 ,money=1000并且價格在10-20之間的的所有商品


可能沒有很清楚的描述出我的問題,但希望大家先看懂表結(jié)構(gòu)再回答,看懂表結(jié)構(gòu)就知道我想問的問題,我現(xiàn)在的解決辦法如下:

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查詢,所以來這里請教大神看看有沒有更好的解決辦法或者表設(shè)計方案

回答
編輯回答
心上人

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();

2017年1月2日 16:00
編輯回答
遲月

方法1,使用join
方法2,使用wherein
從goods找出價格在10-20之間的所有g(shù)oods_id
在goods_ext里wherein,再加上其他條件

2017年9月21日 02:19
編輯回答
情皺

沒有人回答嗎?

2018年7月13日 04:58
編輯回答
舊時光

這個可以加多一個中間表:
商品表,保存商品基本信息,商品名稱,商品編碼...
商品屬性表,屬性名,屬性值...
商品--屬性中間表,保存商品-屬性關(guān)聯(lián)關(guān)系;
再有就是盡量保證SQL語句的簡潔性;
純屬個人意見啊...

2018年2月10日 08:05
編輯回答
瞄小懶

這表設(shè)計的不怕被打死嗎。。

2018年4月1日 19:00