2015-12-28 95 views
1

我有一个表设施。 结构看起来如下:Mysql连接查询多个值

id | name 
--------- 
1 | Hotel 
2 | Hospital 
3 | medical shop 

我有从上述表中获取数据,并保持多个值在一列中的其他表。查看如下所示:

id | facilities 
--------------- 
1 | Hospital~~medical shop~~Hotel 
2 | Hospital~~Hotel 
3 | medical shop~~Hotel 

如果我想加入这两个表,查询看起来如何?

我想这一点,但没有奏效:

select overview.facilities as facility 
from overview join facility on facility.id=overview.facilities; 
+0

你认为JOIN的结果是什么? –

+0

我基本上想要显示列表中的第二个表中的值,当我尝试编辑窗体时,我应该能够区分选定的值(从第二个表中取出)和未选择的值(取出的值从第一张桌子)。 –

+0

在这两个表中都没有关系,你需要添加一个关联列 – devpro

回答

2

你可以用

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)将返回真实的,并且匹配的行会被退回......你用分隔符~~它不会工作与FIND_IN_SET分离的设施...所以我用REPLACE()~~更改为逗号,然后在JOIN条件中使用它。你可以以多种方式从这里出发..例如让我们说你想要设施ID的概述..你只需添加在选择GROUP_CONCAT(f.id),你有所有的ID ...注意如果你这样做,你需要添加GROUP BY在查询结束时告诉它你想如何分组结果

+0

谢谢你这个伟大的来源。我得到了很多我从未在mysql中看过的通知。 :) –