我有一个简单的EAV之类的数据库,其中有3个表:产品,属性,attribute_values。
我正在使用下面的代码来查找所有具有“长度”属性的产品,然后我使用子字符串函数来摆脱“英寸”,此后,我使用之间的方法来获取所有“长度”在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'
在我看来,子字符串遍历了数据库中的所有attribute_value,即使那些未引用属性“ length”的子字符串也可以更改?
答案 0 :(得分:1)
SUBSTRING_INDEX()函数返回字符串的子字符串 然后是您的条件
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()函数返回字符串的子字符串
of,如果您希望字符串的数字部分在“英寸”之前,则可以尝试使用
WHERE cast(trim(substring_index(attribute_values.value,'inch',1)) AS UNSIGNED ) + 0
BETWEEN 0 AND 5
为避免非数字内容的警告,您可以在有条件的情况下尝试使用
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