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

Php 从数据库中的多个值中选择一个值,php,mysql,Php,Mysql,我在VendorIDs字段中存储了多个值,我想使用WHERE选择多个值中的一个值 例: 桌子 代码 当我选择了VendorIDs=2时,它将仅以值=2中的第一个值显示 | OrderIDs | VendorIDs | CustomerIDs | -------------------------------------- | 1 | 2, 3, 4 | 01 | | 4 | 2, 3, | 04 | ----------

我在
VendorIDs
字段中存储了多个值,我想
使用
WHERE
选择多个值中的一个值

例:

桌子

代码

当我选择了
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     |
--------------------------------------

如果列类型为text,则可以使用LIKE关键字与字符串“%2,%”(注意空格和逗号作为分隔符)进行文本匹配。例如

从供应商ID为“%2,%”的订单中选择*


更好的是,如果您使用这些ID查找其他内容,请将它们存储在单独的表中并加入
中。然后您可以使用
组连接(VendorId
)和一个按VendorId分组的
来将结果聚合成类似的格式。

如果您确定您的ID以逗号分隔的格式存储,如图所示,您可以执行以下操作:

declare vendorId int;
SELECT * FROM orders WHERE VendorIDs LIKE CONCAT('%', vendorId, ',%')
这应该可以很好地工作,但它会拒绝任何索引使用(起始%),并且会发生表扫描(当Orders表非常大且查询不会缩小结果时,会出现明显的差异)

通常情况下,您的
VendorIDs
应存储在X表中,以允许索引:

**OrderVendor**
Id
OrderId
VendorId

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

  • 数字ID应存储为数字,而不是字符串
  • 每列应包含一个数据项,而不是多个数据项
  • ID应该具有外键约束
  • SQL对于列表有很好的数据结构。它被称为表,而不是字符串列
也就是说,有时候你会被别人糟糕的设计决策所困扰

如果是这样,您可以使用
find_in_set()

或者,您也可以使用类似的

where concat(', ', vendorids, ', ') like concat(', %', 2, ', %)

如果您的
vendorIDs
有两列,..
vendId
orderId
则可能更容易复制,这样您就有了一个与单个订单ID关联的单个供应商ID。然后您就有了多个列..“Ven ID 1-订单2”Ven ID 2-订单2”Ven ID 3-订单2“因此,您可以看到,我们在这里为订单2分配了1,2,3全部。这是一个多维数据库。
SELECT*FROM orders WHERE FIND_IN_SET(2,VendorIDs)
SELECT*FROM orders WHERE FIND_IN_SET(2,VendorIDs)它成功了,问题解决了,非常感谢。如果结果是第一个结果怎么办?数字前面会有空格吗?很好;您可能必须使用
如“2,%”或“%2,%”
因此迎合了“领先两个或仅领先两个”。同样,这是一个可怕的查询黑客,最好通过改进的模式来解决。+1我建议阅读比尔·卡温的优秀著作第2章。第2章可在亚马逊的“查看内部”中找到。
**OrderVendor**
Id
OrderId
VendorId
where find_in_set(2, replace(vendorids, ' ', '')) > 0
where concat(', ', vendorids, ', ') like concat(', %', 2, ', %)