已知表A、B、C,如何求表D中标红的两个数据呢?

 

本题目提示答案,测试运行环境是MySQL。

 

第一步:我们来检验一下三张tables,分别是table_a, table_b 和 table_c.

mysql> select * from table_a;
+—–+——+———-+———+
| aid | name | title    | type    |
+—–+——+———-+———+
|   1 | H    | Height   | int     |
|   2 | L    | Long     | tinyint |
|   3 | M    | Material | varchar |
+—–+——+———-+———+
3 rows in set (0.00 sec)

mysql> select * from table_b;
+—-+——+———–+—————+
| id | aid  | int_value | varchar_value |
+—-+——+———–+—————+
|  1 |    1 |        10 | 0             |
|  2 |    3 |         0 | Golden        |
+—-+——+———–+—————+
2 rows in set (0.00 sec)

mysql> select * from table_c;
+—-+——+———-+
| id | name | attri_id |
+—-+——+———-+
|  1 | Box  | 1,3      |
+—-+——+———-+
1 row in set (0.00 sec)

 

第二步,我们按照题目要求,分别取出aid相对应的结果。

可惜,结果是分两行来显示的哦,各位同学自己尝试一下,是否可以完成最终在一行显示结果。

 

另外,这种解法还有一个问题,就是固定了attri_id 的属性数量,如何解决呢?

mysql> select p.id, p.name, al.int_value, al.varchar_value from(
-> select id, name, convert(substring_index(attri_id, ‘,’, 1), unsigned integer) as aid1, convert(substring_index(attri_id, ‘,’, -1), unsigned integer) as aid2 from table_c
-> ) as p
-> left join table_b
-> as al
-> on p.aid1 = al.aid or p.aid2 = al.aid;
+—-+——+———–+—————+
| id | name | int_value | varchar_value |
+—-+——+———–+—————+
|  1 | Box  |        10 | 0             |
|  1 | Box  |         0 | Golden        |
+—-+——+———–+—————+
2 rows in set (0.00 sec)

 

最后,我想给一些学有余力,SQL掌握较好的同学,给大家遗留一个问题:

如果每张tables的数据量很大呢?还可以用这种办法吗?

如何在完成面试题目要求的同时,如何最优的去考虑query performance呢?