[英]Mysql join query multiple values
我有一張桌子叫設施 。 結構如下:
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;
你可以用一點黑客來做到這一點
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 ...請注意,如果這樣做您需要在查詢末尾添加GROUP BY,以告知您如何將結果分組
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.