史上最难的mysql面试题啊,列C的产品,求得它的属性标识和值,求大神来解惑啊

amhoho 发布于 2016/11/01 21:15
阅读 1K+
收藏 1
要考虑效率,比如查询一千个商品,若按照php思维先列产品再循环根据条件又查询,那么将是个很低很低的效率,总而言之能mysql一句就不能两句有的人还会说设计逻辑什么的,拜托只是一道面试题,低头求解即可,别想太复杂.

题目如下:ABC表求得D结果,即用最精简的mysql列出C的产品及属性标识和值

加载中
1
风筝上的少年
风筝上的少年
上班的东西请自己完成,要不然把你当天的工资捐出来。
a
amhoho
回复@风筝上的少年 : 呵呵 我倒是很喜欢做这种面试题,深入分析大有裨益.先质疑问题的合理,再推出自己的方案.挺考功力的,另外这是一个微信群里的挑战问答题,很多人都在作答,你要站在面试官的角度思考一道题目的意义才知道它的目的.
0
空空i
select e.henght,p.name,t.varchar_value from sys_attribute as e left jion sys_attribute_list as t on e.aid = t.aid left jion sys_product as p on t.aid in p.attr_id   试一下  希望能帮助你
0
邹海彬
邹海彬
楼主实现了吗? 建议不在sql中解决, dsl不如通用语言更具普适性, 欢迎加微信214710841交流
0
溜得滑
溜得滑
这道题确实被难住了,下来自己试过一下,SQL写了半天没啥门路 ,收藏了
魔力猫
魔力猫
回复 @逆时针合适 : 因为这题本身就是违规在先。结构上的致命缺陷不是小技巧可以解决的。我最多可以做到能把数据查出来,但是单条效率肯定极其糟糕。
溜得滑
溜得滑
回复 @魔力猫 : 你这违背题意了啊,你这不是用sql来解决问题,而是给了你需求你来重新设计了,答非所问啊
魔力猫
魔力猫
就一句话,先重构数据库结构。重构后SQL会很容易,不重构,怎么也好不了。
0
魔力猫
魔力猫

这道题核心问题是表C中的atti_id,是反范式的混蛋设计。在这种情况下,无论如何想办法玩技巧,也无法确保效率。

与其折腾各种奇淫技巧,不如老实把表结构处理好,把省略的关联表加上。

0
这里的名字只能十个字
这里的名字只能十个字

我的想法。。

1.首先这是mysql,抛开视图、函数等特性,单纯sql语句上来讲,应该无法实现动态删减列的功能,因此列是固定的,也就是说,不管表设计之初是怎样的,至少A表可以先排出,也就是语句本身应该应用不到它。

2.C表中的attr_id有两种猜想,假设这个值是常量,那么我们查询时可将该列排除,JOIN以后直接查询即可。假设C-B中,该值为1对多关系,是个变量,那么可以通过substring_index来分割两列1,-1。然后分别查询该值对应B表中的结果,能想到基本这么多。

用NoSql比如mongodb就比较适合这种结构。

魔力猫
魔力猫
这题的反范式设计,感觉就是为了节约一个关联表而已。为了少一个表,给自己添了一大堆麻烦。
0
farce
farce
求结果的:where A.id=1 and B.aid=3 and C.aid=3,之前的联合查询
0
J
Joseph_hu
MySQL不能三个表联历,这样查询太慢
曾经的十字镐
曾经的十字镐
才3张表,无所谓,我们动不动都是7--8张表关联
0
FrankHong
FrankHong
谁告诉你的php思维就是“先列产品再循环根据条件又查询”?
0
2
235235
你这业务表设计的。。
返回顶部
顶部