2015-12-28 92 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中看過的通知。 :) –