MySQL 查询问题求教

2019-01-18 18:11:21 +08:00
 lyusantu
查询一个商家列表,同时每个商家又返回自己店铺销量最高的三条数据

商家 1 -> 货品 1,货品 2,货品 3
商家 2 -> 货品 1,货品 2,货品 3
商家 3 -> 货品 1,货品 2,货品 3

大佬们在 MySQL 下有什么好的解决方案吗,现在写的 SQL 在数据量大的情况下执行>60s,所以这个要废弃的 SQL 就不拿出来献丑了
2774 次点击
所在节点    程序员
29 条回复
littleylv
2019-01-18 18:20:51 +08:00
试试先查商家,再循环商家查商品
lyusantu
2019-01-18 18:22:51 +08:00
@littleylv 現在就是這樣的
lyusantu
2019-01-18 18:23:04 +08:00
@littleylv 不希望使用循環,但是沒有什麽特別好的解決方案了
wysnylc
2019-01-18 18:25:55 +08:00
用程序解决,在数据库解决扩展性维护性极低
Exialin
2019-01-18 18:26:31 +08:00
MySQL 8.0 后可以用窗口函数。
Variazioni
2019-01-18 18:27:37 +08:00
复杂查询无谓就是行专列列转行。。外加一堆条件。先写出来最笨的方法之后再优化。。
如果发现查询时间太长。。
其实索引和表结构设计的原因更多一点。。
wysnylc
2019-01-18 18:28:02 +08:00
提供一个思路,查询所有商品中前 10%销量的(加一个限定条件销量必须大于 XX),然后将商品按店家分组就行,数据量小不建议这么做,数据量起来了这样做很方便.
tiedan
2019-01-18 18:33:23 +08:00
可不可以这样,按照商家 group by,group_concat 前三个货品的 id。
littleylv
2019-01-18 18:35:20 +08:00
没道理啊,难道你一下查超多商家?
如果是分页的情况,假设你每次查 20 个商家,循环这 20 个去查商品,应该很快啊?
explain 一下你的 sql 语句看看用到索引没
tiedan
2019-01-18 18:35:46 +08:00
当然如果数据量太大 可能会超出 group_concat 的最大长度限制
yidinghe
2019-01-18 18:37:06 +08:00
如果商家列表本身是分页的话,那么 N+1 方式查询问题不大。
Tomorrowxxy
2019-01-18 18:55:42 +08:00
@all v2 的人都不刷 leetcode 的吗
Tomorrowxxy
2019-01-18 18:57:12 +08:00
@lyusantu 关键字 : 部门工资前三高的员工 这里有你想要的
wysnylc
2019-01-18 19:00:52 +08:00
@Tomorrowxxy #13 笑出声,人家问的是怎么优化查询时间不是怎么查出前三,别把人家当白痴最终只能是自己当白痴
Tomorrowxxy
2019-01-18 19:05:25 +08:00
@wysnylc #14 优化查询没问题啊 sql 写的有问题借鉴别人执行效率高的 我说错了吗? 你怎么就知道楼主写的就已经是最优解了呢? leetcode 不止教你怎么写 sql 的一个功能
@lyusantu #2 表索引也记得看下哦
zppass
2019-01-18 19:18:56 +08:00
这个呢,我有一个思路是做个定时任务之类的更新一个表,表里面的数据存放对应的商家以及销售前三的商品信息。直接查这张表,优点是单表查询本身就够快,优化也简单,缺点是不是实时的,万一突然有个爆款,你设置的定时任务间隔太长,一时反应不出来。
wysnylc
2019-01-18 19:22:57 +08:00
@Tomorrowxxy #15 "部门工资前三高的员工" 关键字搜出来的就是教怎么写查前三而已,这个根本没有难度不需要查询.
至于你说的优化你看看你说的: 关键字 : 部门工资前三高的员工 这里有你想要的 .这句话里有任何相关内容和意思?
说的跟废话一样出来 diss 别人可笑不可笑,刷过两道题就忘了自己是谁
hanxiV2EX
2019-01-18 19:23:54 +08:00
用楼上的方法吧,分个数据库出来,不要搞实时的。每个事情分开处理。
wysnylc
2019-01-18 19:24:16 +08:00
@zppass #16 这个方案是比较好的,牺牲一定的及时性换来性能的提升.数据量大的统计都建议这样做
mmdsun
2019-01-18 19:52:50 +08:00
1 查商家列表,程序里多线程查 top3 货物。

2 这种 SQL 慢吗?建议贴 explain 出来
select deptno, ename, sal
from emp e1
where
(
select count(*)
from emp e2
where e2.deptno=e1.deptno and e2.sal>=e1.sal
) <=3
order by deptno, sal desc;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/528388

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX