【问题标题】:Multiple warnings in mysql quert after using substring使用子字符串后mysql查询中的多个警告
【发布时间】:2019-04-14 15:56:33
【问题描述】:

我有一个类似 EAV 的简单数据库,它有 3 个表:产品、属性、属性值。

我正在使用下面的代码来查找所有具有“长度”属性的产品,然后我使用子字符串函数来摆脱“英寸”,然后我使用 between 来获取所有“长度”在 0 之间的产品和 5.

SELECT products.name,products.id
FROM products
JOIN attribute_value_product on products.id = attribute_value_product.product_id
JOIN attribute_values on attribute_value_product.attribute_value_id = attribute_values.id
JOIN attributes on attribute_values.attribute_id = attributes.id AND attributes.name = 'length'
WHERE substring_index(attribute_values.value,'inch',1) + 0 BETWEEN 0 AND 5

一切正常,但我收到很多警告:

Warning: #1292 Truncated incorrect DOUBLE value: 'black'    
Warning: #1292 Truncated incorrect DOUBLE value: 'phat farm'    
Warning: #1292 Truncated incorrect DOUBLE value: '2 kg'    
Warning: #1292 Truncated incorrect DOUBLE value: 'roca wear'

在我看来,子字符串正在遍历数据库中的所有属性值,即使是那些没有引用属性“长度”的值 - 是否有可能改变它?

【问题讨论】:

  • 您能分享一下完整查询、表结构和示例数据吗?这将更容易重现问题
  • 可能是您的问题与您显示的代码部分无关..所以您应该更新您的问题并添加所有查询代码..
  • 嗨,我创建了示例数据库以及查询 - 请在此处找到它:pastebin.com/wzA43xx6 我插入了 2 个产品:一个长度为“7 英寸”,第二个长度为“5 英寸” - 取决于BETWEEN 函数中的值 - 它会向您显示其中的一个或两个,因此查询有效 - 但是当您将整个代码放入 phpmyadmin 时 - 您将看到 db 中所有其他属性值的警告

标签: mysql substring


【解决方案1】:

SUBSTRING_INDEX() 函数返回字符串的子字符串 那么你的where条件

WHERE substring_index(attribute_values.value,'inch',1) + 0 BETWEEN 0 AND 5

是错误的,因为您尝试将字符串添加到数字

你可能正在寻找 substr 的左边

WHERE length(substring_index(attribute_values.value,'inch',1)) + 0 BETWEEN 0 AND 5

注意:如果没有找到分隔符('inch'),那么函数会返回所有字符串,所以你应该检查

看来你想看前面的部分:

SUBSTRING_INDEX() 函数返回字符串的子字符串

如果你想要字符串的数字部分在“英寸”之前,你可以尝试使用强制转换

WHERE cast(trim(substring_index(attribute_values.value,'inch',1)) AS UNSIGNED ) + 0 
            BETWEEN 0 AND 5

为了避免非数字内容的警告,你可以试试这个 where 条件

WHERE (case when substring_index(attribute_values.value,'inch',1) = attribute_values.value 
 then 1000 
 else cast(trim(substring_index(attribute_values.value,'inch',1)) AS UNSIGNED ) end )
 BETWEEN 0 AND 5

【讨论】:

  • 在MySql中执行字符串和整数相加没有问题。 'abc' + 1 结果为 1,因为 'abc' 隐式转换为 0
  • 我们不知道预期的结果,并且确保 OP 问题中显示的代码不会导致错误Truncated incorrect DOUBLE value
  • 嗨 - 请在此处找到 db 的示例:pastebin.com/wzA43xx6 它有 2 种产品:一种属性为 'length' 的值为 '5 inch',另一种值为 '7 inch' 的产品。上面的查询将根据 BETWEEN 函数中的值向您显示 1 或 2 个产品 - 但是当您将整个内容移动到 phpmyadmin 时 - 它会向您显示警告
  • 这意味着我的答案中的查询是正确的..我已经在 phpmyadming 中进行了测试并且没有出现警告..可能是警告 si 与查询的其他部分相关(最终是您的选择内容)或为您的phpmyadmin启用了一些警告级别..无论如何请注意您的where条件..当找不到分隔符时,该函数返回完整的字符串..答案已更新。有了这个提醒
  • 您的查询不会产生警告,但不幸的是它不会产生结果 - 使用以下条件:WHERE length(substring_index(attribute_values.value,'inch',1)) + 0 BETWEEN 0 AND 3将向您显示两种产品 - 价值为“7 英寸”的产品和价值为“5 英寸”的产品在这种情况下应该显示 0 个产品
猜你喜欢
  • 2016-03-30
  • 2015-08-13
  • 2013-07-05
  • 1970-01-01
  • 2012-07-27
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多