将字段与存储在mySQL中的多个ID匹配的最佳方法是什么

时间:2015-09-30 09:50:58

标签: php mysql sql

我有一个名为“所有者”列的表,其中包含与该特定记录相关联的用户的IDS。

我目前用“,”分隔数据。例如,

$rootscope.$on $stateChangeSuccess event //it is not triggered and there is no value inside toState
$state.go().then //which makes my code execute from the second time.

当对此进行选择时,我打算使用以下SQL:

ID | Name | Owners
1 | Bob | 1,4,5

但现在我意识到这是有缺陷的(搜索5将匹配5,15,25甚至50)。

这样做的正确方法是什么?

5 个答案:

答案 0 :(得分:2)

@Amarnasan是正确的:不要在用逗号分隔的单个字段中存储多个值!

在Bill Karwin的Record_ID | Owners_ID 1 | 1 1 | 4 1 | 5 书中,这被称为Jaywalking反模式。

正确的方法是创建一个将select * from table join intersection_table where intersection_table.record_id = table.id and intersection_table.owners_id = '$profile' 连接到第一个表的交集表。交叉表中有多行代表每条记录的多个所有者:

Department

您的查询将类似于:

Department

答案 1 :(得分:0)

我不会以这种方式存储数据(这不是'声音'数据库设计)。

但是如果你坚持这样做,你可以通过自己明确地包括逗号来确保你的其他数字不满足这个条件:

SELECT * FROM table WHERE ',' + owner + ',' LIKE '%,5,%'

答案 2 :(得分:0)

同样,我不会使用这种方法来存储数据..但是如果您在重构之前无法更改它或需要补丁,我会使用以下内容:

'field'=>'slug'

See FIND_IN_SET docs

答案 3 :(得分:0)

使用find_in_set

SELECT * FROM table where find_in_set($profile,owner)

答案 4 :(得分:0)

here是一个很好的解决方法只有你没有时间FIND_IN_SET

小心,这种方法非常敏感,会查找每个逗号之间的整个值。因此,如果您使用"1, 2, 3"这样的空格存储数字,那么将返回的值将是"1"" 2"" 3",而不是"1",{ {1}},"2"(注意第一组有空格)。