现在商品 item 表结构
id, product_id, type, price
一个 product 下有多个商品,商品 item 有 4 种 type 值(0,1,2,3),同一个 type 下可以有多个同样 type 与同样 product_id 的商品。
现在有 N 个商品 id,我要根据这些商品 id,来获取这些商品的 product_id,然后根据这些 product_id 再获取 item 表里面,所有 product_id 与 4 个 type 值组合下的一个 price 最低的商品 的列表。
目前我是这么写的
SET session sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));
SELECT min(price), id, product_id, type
FROM item
WHERE product_id IN(
SELECT product_id FROM item WHERE id IN (1,2,3,4,5)
)
GROUP BY product_id, type
应该怎么写成一句 sql ?
1
Mazexal 2018-07-23 10:07:37 +08:00
第一, 不要把 sql 写的太复杂, 不利于复用
第二, 复杂 sql 不便于阅读与拍错 复杂 sql 建议拆分成简易 sql 使用事务处理 |
2
yulitian888 2018-07-23 10:10:40 +08:00
开窗函数了解一下?
|
4
bpllzbh 2018-07-23 10:27:31 +08:00
|
5
webcoder 2018-07-23 10:47:49 +08:00
其实理论上 lz 说的方法是没问题的,只要在 product_id 作个索引,速度也不会太慢。
但实际应用时,需要翻页的话,就要拆成两个 sql 句才行。 第一个 SELECT distinct product_id FROM item WHERE id IN (1,2,3,4,5) limit 0,10 注:加上 distinct 是防止重复的 product_id 出现,导致翻页出现空窗 然后再用的 SELECT min(price), id, product_id, type FROM item WHERE product_id IN( 第一句的结果 ) GROUP BY product_id, type 这样翻页的效率会高一些。 |
6
saulshao 2018-07-23 10:52:37 +08:00
听上去不难,思路是这样的:
1. 根据你知道的商品 ID 获取所有的 Product_id; 2. 根据你得到的所有 PRODUCT_ID,去商品表里面按照读取 PRODUCT_ID,TYPE,PRICE。按照 PRODUCT_ID,TYPE 这 2 个字段分组,获得最小的 PRICE. (到这里你似乎已经实现了) 3. 根据 2 的结果,直接用商品表读取 PRODUCT_ID,TYPE,PRICES 都和 2 的结果相等的所有行就行。 |