16
回答
史上最难的mysql面试题啊,列C的产品,求得它的属性标识和值,求大神来解惑啊
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
要考虑效率,比如查询一千个商品,若按照php思维先列产品再循环根据条件又查询,那么将是个很低很低的效率,总而言之能mysql一句就不能两句有的人还会说设计逻辑什么的,拜托只是一道面试题,低头求解即可,别想太复杂.

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

举报
amhoho
发帖于1年前 16回/1K+阅
共有16个答案 最后回答: 1年前
上班的东西请自己完成,要不然把你当天的工资捐出来。
--- 共有 1 条评论 ---
amhoho回复@风筝上的少年 : 呵呵 我倒是很喜欢做这种面试题,深入分析大有裨益.先质疑问题的合理,再推出自己的方案.挺考功力的,另外这是一个微信群里的挑战问答题,很多人都在作答,你要站在面试官的角度思考一道题目的意义才知道它的目的. 1年前 回复
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   试一下  希望能帮助你
这道题确实被难住了,下来自己试过一下,SQL写了半天没啥门路 ,收藏了
--- 共有 3 条评论 ---
魔力猫回复 @逆时针合适 : 因为这题本身就是违规在先。结构上的致命缺陷不是小技巧可以解决的。我最多可以做到能把数据查出来,但是单条效率肯定极其糟糕。 1年前 回复
溜得滑回复 @魔力猫 : 你这违背题意了啊,你这不是用sql来解决问题,而是给了你需求你来重新设计了,答非所问啊 1年前 回复
魔力猫就一句话,先重构数据库结构。重构后SQL会很容易,不重构,怎么也好不了。 1年前 回复

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

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

我的想法。。

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

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

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

--- 共有 1 条评论 ---
魔力猫这题的反范式设计,感觉就是为了节约一个关联表而已。为了少一个表,给自己添了一大堆麻烦。 1年前 回复
顶部