从数据库中选择多个值的一个值

时间:2016-01-09 02:37:01

标签: php mysql

我在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     |
--------------------------------------

3 个答案:

答案 0 :(得分:1)

首先,您的数据结构错误。您不应该在单个字符串字段中存储多个ID。以下是一些原因:

  • 数字ID应存储为数字,而不是字符串。
  • 每列应包含一个数据项,而不是多个项目。
  • Ids应该有外键约束。
  • SQL为列表提供了很好的数据结构。它被称为表,而不是字符串列。

尽管如此,有时你会被其他人的糟糕设计决定所困扰。

如果是,您可以使用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