我有一个名为 facility 的表。 结构如下:
blabla
我有另一个表从上表中获取数据并在一列中保留多个值。视图如下所示:
id | name
---------
1 | Hotel
2 | Hospital
3 | medical shop
如果我想加入这两个表,查询怎么样?
我尝试了这个,但它不起作用:
id | facilities
---------------
1 | Hospital~~medical shop~~Hotel
2 | Hospital~~Hotel
3 | medical shop~~Hotel
答案 0 :(得分:2)
你可以用一点hackery来做到这一点
select o.facilities as facility
from overview o
join facility f on find_in_set(f.facilities, replace(o.facilities, '~~', ','));
我强烈建议您更改存储数据的方式。目前它被认为是未规范化的,很快就会变成一个怪物来处理
你应该改变你的表结构,看看更像这样的东西
+----------+--------------+
| facility |
+----------+--------------+
| id | name |
+----------+--------------+
| 1 | Hotel |
| 2 | Hospital |
| 3 | medical shop |
+----------+--------------+
+-----------+-------------+
| overview |
+-----------+-------------+
| id | facility_id |
+-----------+-------------+
| 1 | 2 |
| 2 | 3 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 3 |
| 7 | 1 |
+-----------+-------------+
代码说明:
基本上你想要在概述中找到匹配的设施。 MySQL有一个方便的函数是 FIND_IN_SET() ,它允许你在逗号分隔的字符串中找到一个项目,而find_in_set(25, '11,23,25,26)
将返回true并返回匹配的行...你将您的设施与不能使用find_in_set的分隔符~~
分开...所以我使用REPLACE()将~~
更改为逗号,然后在JOIN条件中使用它。你可以通过多种方式从这里开始..例如,假设你想要设施ID为概述...你只需添加选择GROUP_CONCAT(f.id)
,你就拥有了所有的id' s ...请注意,如果您这样做,则需要在查询结尾处添加GROUP BY,以告诉您希望如何将结果分组