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, ', %)