Mysql 如何从RAM在1MB到2GB之间的数据库表中获取所有设备?

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 ================================================ 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中执行此操作?请帮助

这开始只是一条评论,但随后超出了可用空间。我们可以给你一个查询,但它会膨胀和丑陋。您最好将您的表设计修改为以下内容:

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我相信这个答案应该是这样的,因为我需要在这段时间吃东西,那时第一个答案有点不完整,但是是的,它非常难看。。