我有2张桌子
现在有90%的时间用户连接到1个位置。但现在出现了一个场景,其中1个用户有2个位置
我已经完成了这个
Locations table
id name
1 A
2 B
3 C
用户表
id location_id
1 1
2 1
3 1,2
现在我想做一个查询,我可以将逗号分隔的字符串(如1,2)与表格位置匹配得到1和2。
最好的方法是什么?
答案 0 :(得分:1)
数据格式选择不当。当SQL具有用于存储列表的良好结构时,您将以字符串形式存储事物列表。它被称为表,在这种情况下特别是连接表。另外,您将(可能)数字ID存储为字符串。
尽管如此,你可以做你想做的事:
select u.*, l.name
from users u join
locations l
on find_in_set(l.id, u.location_id) > 0;
性能不会很好,但这是数据布局不佳的代价之一。
答案 1 :(得分:0)
如果您有能力稍微更改架构,那么最好的办法是通过创建一个将用户映射到位置的单独表来规范化表。这样就变成了:
Locations
ID name
1 A
2 B
...
Users
ID name (or whatever)
1 jsmith
2 jdoe
UsersLocations
ID user_id location_id
1 1 1
1 2 1
1 2 2
答案 2 :(得分:0)
您可以使用FIND_IN_SET
SELECT * FROM users u JOIN locations l ON FIND_IN_SET(l.id, u.location_id) > 0