Mysql 如何从RAM在1MB到2GB之间的数据库表中获取所有设备?
我将值存储在MySql表中,如下所示: id content_id group_id value ================================================ 12274 251 5 4 GB, 512 MB RAM 12323 252 5 32 GB, 2 GB RAM 12372 253 5 8 GB, 2 GB RAM 12421 254 5 8 GB, 1 GB RAM 12470 255 5 8 GB, 1 GB RAM 12519 256 5 4 GB, 512 MB RAM id内容\u id组\u id值 ================================================ 12274 251 5 4 GB,512 MB RAM 12323252532GB,2GB内存 1237225358GB,2GB内存 12421 254 5 8 GB,1 GB RAM 12470 255 5 8 GB,1 GB RAM 12519 256 5 4 GB,512 MB RAM 其中value列包含内存和移动俱乐部的RAM,每行用逗号隔开,现在我想对value列执行搜索结果,该列给出RAM“512 MB”和“2 GB”之间的所有行Mysql 如何从RAM在1MB到2GB之间的数据库表中获取所有设备?,mysql,Mysql,我将值存储在MySql表中,如下所示: id content_id group_id value ================================================ 12274 251 5 4 GB, 512 MB RAM 12323 252 5 32 GB, 2 GB RAM 12372 253 5 8 GB,
如何在MySql中执行此操作?请帮助这开始只是一条评论,但随后超出了可用空间。我们可以给你一个查询,但它会膨胀和丑陋。您最好将您的表设计修改为以下内容:
id content_id group_id value_low value_high
=========================================================
12274 251 5 0.512 4
12323 252 5 2 32
12372 253 5 2 8
12421 254 5 1 8
12470 255 5 1 8
12519 256 5 0.512 4
这里需要注意的关键点是,首先,对于内存范围的低部分和高部分,我们有单独的真正的列。其次,我们在任何地方都使用一致的单位GB。考虑到这些更改,我们可以轻松编写您的查询:
SELECT *
FROM yourTable
WHERE value_high >= 2.0 AND value_low <= 0.512;
选择*
从你的桌子上
其中value\u high>=2.0和value\u low逗号分隔的值很难查询
需要使用复杂的SQL将项目解析为记录,因此理想情况下应该像Tim Biegeleisen建议的那样进行规范化
另外,当您使用MySQL 8.0时,使用正则表达式可能更容易
查询
SELECT
#remove duplicates
DISTINCT
t.*
, TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(t.value, ',', numbers.number), ',', -1)) AS tag
, CASE
WHEN LOCATE('GB', UPPER(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(t.value, ',', numbers.number), ',', -1)))) > 0
# return GB to MB calculated
THEN (TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(t.value, ',', numbers.number), ',', -1)) + 0.00) * 1024
# return MB value
ELSE TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(t.value, ',', numbers.number), ',', -1)) + 0.00
END AS MB_calculated
FROM (
SELECT
@number := @number + 1 AS number
FROM (
(SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) row1
CROSS JOIN
(SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) row2
CROSS JOIN
(SELECT @number:=0) AS init_user_params
)
)
AS numbers
CROSS JOIN t
WHERE
CASE
WHEN LOCATE('GB', UPPER(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(t.value, ',', numbers.number), ',', -1)))) > 0
# return GB to MB calculated
THEN (TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(t.value, ',', numbers.number), ',', -1)) + 0.00) * 1024
# return MB value
ELSE TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(t.value, ',', numbers.number), ',', -1)) + 0.00
END BETWEEN 512 AND (2 * 1024)
结果
| id | content_id | group_id | value | tag | MB_calculated |
| ----- | ---------- | -------- | ---------------- | ---------- | ------------- |
| 12274 | 251 | 5 | 4 GB, 512 MB RAM | 512 MB RAM | 512 |
| 12323 | 252 | 5 | 32 GB, 2 GB RAM | 2 GB RAM | 2048 |
| 12372 | 253 | 5 | 8 GB, 2 GB RAM | 2 GB RAM | 2048 |
| 12421 | 254 | 5 | 8 GB, 1 GB RAM | 1 GB RAM | 1024 |
| 12470 | 255 | 5 | 8 GB, 1 GB RAM | 1 GB RAM | 1024 |
| 12519 | 256 | 5 | 4 GB, 512 MB RAM | 512 MB RAM | 512 |
请参见感谢Tim的快速回复,但我很难更新表格结构,因为该项目太旧,并且有数千个条目。绝对不会犯设计错误的案例研究(阅读:走捷径)在开始时,因为现在你真的很难解决这个问题,但是数据是以一种完全不合适的方式存储的。哀悼!实际上,我会存储字节,并将其保持在固定点(实际上是整数)。浮点千兆字节有很多潜在问题。@LightnessRacesinOrbit如果我错了,请纠正我,但MySQL整数最多只能覆盖4GB左右。我们真的应该在这里使用double。同意,但该项目是由其他人开始的,我在这里添加新功能,我只能找到解决方法,更新结构完全超出我的范围。我需要在不更新其结构的情况下获得结果。你真的应该后退。一次更新结构可能比这个查询看起来要明智得多(以及它的运行速度)。这并不是不回答所提出的问题的理由(我希望有人回答),但我不能强调这一点,因为在现实世界中,“我需要在不更新其结构的情况下获得结果”请参阅我的(更新的)答案和方法现在我们需要从中获得一个数字,并进行比较。会很难看的!事实上@LightnessRacesinOrbit您还必须将MB转换为GB,获取数字不是问题。如果OP使用的是MySQL 8+,那么regex就是一条出路。获取数字需要进一步解析,即答案不完整。“获取数字需要进一步解析,即答案不完整。”@LightnessRacesinOrbit我相信这个答案应该是这样的,因为我需要在这段时间吃东西,那时第一个答案有点不完整,但是是的,它非常难看。。