Mysql连接查询多个值

时间:2015-12-28 18:38:25

标签: php mysql

我有一个名为 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

1 个答案:

答案 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,以告诉您希望如何将结果分组