我在VendorIDs
字段中存储了多个值,并希望SELECT
使用WHERE
多个值的一个值。
前:
表
| OrderIDs | VendorIDs | CustomerIDs |
--------------------------------------
| 1 | 2, 3, 4 | 01 |
| 2 | 1, 2, 4 | 02 |
| 3 | 1 | 03 |
| 4 | 2, 3, | 04 |
--------------------------------------
代码
SELECT * FROM orders WHERE VendorIDs = 2
当我选择VendorIDs = 2
时,它将仅显示第一个值= 2。
| OrderIDs | VendorIDs | CustomerIDs |
--------------------------------------
| 1 | 2, 3, 4 | 01 |
| 4 | 2, 3, | 04 |
--------------------------------------
这就是我想要的,它应该像这样显示:
| OrderIDs | VendorIDs | CustomerIDs |
--------------------------------------
| 1 | 2, 3, 4 | 01 |
| 2 | 1, 2, 4 | 02 |
| 4 | 2, 3, | 04 |
--------------------------------------
答案 0 :(得分:1)
首先,您的数据结构错误。您不应该在单个字符串字段中存储多个ID。以下是一些原因:
尽管如此,有时你会被其他人的糟糕设计决定所困扰。
如果是,您可以使用find_in_set()
:
where find_in_set(2, replace(vendorids, ' ', '')) > 0
或者,您可以使用like
:
where concat(', ', vendorids, ', ') like concat(', %', 2, ', %)
答案 1 :(得分:0)
如果你的列类型是文本,那么你可以使用LIKE关键字和字符串"%2,%"进行文本匹配。 (注意空格和逗号作为分隔符。例如
SELECT * FROM Orders where VendorIDs LIKE "% 2,%"
更好的是,如果您使用这些ID来查找其他内容,请将它们存储在单独的表格中JOIN
。然后,您可以使用Group_Concat(VendorId
)和GROUP BY VendorId
将结果聚合为类似的格式。
答案 2 :(得分:0)
如果您确定您的ID以逗号分隔格式存储,如图所示,您可以执行以下操作:
1 cat
2 cat
3 cat
4 dog
5 dog
6 cat
7 cat
这应该可以正常工作,但它会拒绝任何索引使用(起始%)并且会发生表扫描(当您的Orders表非常大且查询不会缩小结果时,会出现明显的差异。)
通常,您的declare vendorId int;
SELECT * FROM orders WHERE VendorIDs LIKE CONCAT('%', vendorId, ',%')
应存储在X表中,以便进行索引:
VendorIDs