【问题标题】:SQL not returning expected resultsSQL 未返回预期结果
【发布时间】:2021-05-05 00:23:34
【问题描述】:

当我将这段 SQL 输入 PHPMyAdmin 时,它返回的结果与我的预期不符

SELECT
    *
FROM
    `wtlaptop`
WHERE
    `laptopgpu` LIKE '%GTX%'
    OR
    `laptopgpu` LIKE '%RTX%'
    AND
    `memorysize` LIKE '%16GB%'
    OR
    `memorysize` LIKE '%32GB%'
    OR
    `memorysize` LIKE '%64GB%'
    AND
    `laptopbrand` LIKE '%Asu%'
ORDER BY
    ABS(`productprice` - 3145)

我的目的是找到华硕制造的具有 GTX GPU 或 RTX GPU 以及 16GB 或 32GB 内存的笔记本电脑,然后从最接近用户输入的价格订购。

但是,当我在 PHPMyAdmin 中运行此查询时,我得到的结果有 8GB 内存,而结果不是来自 ASUS 等品牌。 示例

3128
Intel Core i7
32GB
Nvidia GTX 1650 Ti
Windows 10 Home
HP

我的表结构是

productprice varchar(61),
cpufamily    varchar(25),
memorysize   varchar(20),
laptopgpu    varchar(28),
laptopos     varchar(32),
laptopbrand  varchar(9)

【问题讨论】:

  • 数据质量是零售产品数据库的一个大问题——您确定memorysize 中的所有条目都不包含空格或不同的单位吗?例如'32' vs '32 GB' vs '32GB' vs '32768MB'?我强烈建议您在导入数据时首先对其进行规范化,这样您就可以使用强类型列来避免此类问题(因此memorysizeint,以兆字节为单位,而不是varchar)。

标签: mysql sql mariadb


【解决方案1】:

您没有指定您的期望,但我认为您只需要围绕您的条件使用括号:

SELECT *
FROM `wtlaptop`
WHERE (`laptopgpu` LIKE '%GTX%' OR `laptopgpu` LIKE '%RTX%') AND 
      (`memorysize` LIKE '%16GB%' OR `memorysize` LIKE '%32GB%' OR `memorysize` LIKE '%64GB%') AND
      `laptopbrand` LIKE '%Asu%'
ORDER BY ABS(`productprice` - 3145);

你也可以使用正则表达式来简化:

SELECT *
FROM `wtlaptop`
WHERE `laptopgpu` REGEXP 'GTX|RTX' AND
      `memorysize` REGEXP '16GB|32GB|64GB' AND
      `laptopbrand` LIKE '%Asu%'
ORDER BY ABS(`productprice` - 3145);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    相关资源
    最近更新 更多