MySQL 在分隔的连字符列表中查找值
MySQL find value in a separated hyphen list
我有一个用户 ID,我想使用绑定方法查找此 ID 是否存在于带连字符的分隔列表中:
我有 2 个问题:
1-正确的SQL查询,
2-如何绑定值
Table结构:
mysql> SELECT dash_cat_id, dash_users_cats FROM dash_cats;
+-------------+-----------------+
| dash_cat_id | dash_users_cats |
+-------------+-----------------+
| 1 | 2 |
| 2 | 1,2 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1,2,3 |
| 6 | 1,2,3 |
| 7 | 1,2,3 |
| 8 | 1,2,3 |
+-------------+-----------------+
8 rows in set (0.00 sec)
$userID = 2; // this might be changed to 1 OR 3, it depends of the user
那我想把userID为2的所有dash_users_cats都检索出来作为例子;
我使用了这个查询,但好像是错误的:
mysql> SELECT dash_cat_id, REPLACE(dash_users_cats, '-', ',') as dashRep from dash_cats WHERE FIND_IN_SET(2, dash_users_cats);
+-------------+---------+
| dash_cat_id | dashRep |
+-------------+---------+
| 1 | 2 |
| 4 | 2 |
+-------------+---------+
2 rows in set (0.00 sec)
编辑:
我把连字符改成了逗号
在关系数据库中,没有“列表”或“数组”。使用一组行,给定列中每行一个值。
mysql> SELECT dash_cat_id, dash_users_cats FROM dash_cats;
+-------------+-----------------+
| dash_cat_id | dash_user_id |
+-------------+-----------------+
| 1 | 2 |
| 2 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 5 | 2 |
| 5 | 3 |
| 6 | 1 |
| 6 | 2 |
| 6 | 3 |
| 7 | 1 |
| 7 | 2 |
| 7 | 3 |
| 8 | 1 |
| 8 | 2 |
| 8 | 3 |
+-------------+-----------------+
现在您可以轻松搜索特定用户:
SELECT * FROM dash_cats WHERE dash_user_id = 2;
您应该通过针对每个 user_id 存储单个 user_cat 值来规范化您的表格。参考@Bill Karwin 的回答。但是,您仍然可以通过在 WHERE
子句
中用连字符替换逗号来使当前的解决方案有效
SELECT dash_cat_id,
REPLACE(dash_users_cats, '-', ',') as dashRep
FROM dash_cats
WHERE FIND_IN_SET(2, REPLACE(dash_users_cats, '-', ','))
我有一个用户 ID,我想使用绑定方法查找此 ID 是否存在于带连字符的分隔列表中:
我有 2 个问题:
1-正确的SQL查询,
2-如何绑定值
Table结构:
mysql> SELECT dash_cat_id, dash_users_cats FROM dash_cats;
+-------------+-----------------+
| dash_cat_id | dash_users_cats |
+-------------+-----------------+
| 1 | 2 |
| 2 | 1,2 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1,2,3 |
| 6 | 1,2,3 |
| 7 | 1,2,3 |
| 8 | 1,2,3 |
+-------------+-----------------+
8 rows in set (0.00 sec)
$userID = 2; // this might be changed to 1 OR 3, it depends of the user
那我想把userID为2的所有dash_users_cats都检索出来作为例子;
我使用了这个查询,但好像是错误的:
mysql> SELECT dash_cat_id, REPLACE(dash_users_cats, '-', ',') as dashRep from dash_cats WHERE FIND_IN_SET(2, dash_users_cats);
+-------------+---------+
| dash_cat_id | dashRep |
+-------------+---------+
| 1 | 2 |
| 4 | 2 |
+-------------+---------+
2 rows in set (0.00 sec)
编辑:
我把连字符改成了逗号
在关系数据库中,没有“列表”或“数组”。使用一组行,给定列中每行一个值。
mysql> SELECT dash_cat_id, dash_users_cats FROM dash_cats;
+-------------+-----------------+
| dash_cat_id | dash_user_id |
+-------------+-----------------+
| 1 | 2 |
| 2 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 5 | 2 |
| 5 | 3 |
| 6 | 1 |
| 6 | 2 |
| 6 | 3 |
| 7 | 1 |
| 7 | 2 |
| 7 | 3 |
| 8 | 1 |
| 8 | 2 |
| 8 | 3 |
+-------------+-----------------+
现在您可以轻松搜索特定用户:
SELECT * FROM dash_cats WHERE dash_user_id = 2;
您应该通过针对每个 user_id 存储单个 user_cat 值来规范化您的表格。参考@Bill Karwin 的回答。但是,您仍然可以通过在 WHERE
子句
SELECT dash_cat_id,
REPLACE(dash_users_cats, '-', ',') as dashRep
FROM dash_cats
WHERE FIND_IN_SET(2, REPLACE(dash_users_cats, '-', ','))