【发布时间】: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 中所有其他属性值的警告