这是我在Stackoverflow上的第一个问题,但是到目前为止,我已经阅读了多年。因此,如果我的问题不合适,请原谅。我一直在搜索网络几个小时,没有找到任何东西。
我目前正在优化在MySQL数据库上工作的系统的查询。一张桌子拿着另一个表格的总和,以加快显示这些总和的前端。我最终发现的查询是替换代码中的多个其他查询和循环...如果它可以正常工作:)
这是无法预期的工作:
SELECT
v.*,
(
SELECT COUNT(DISTINCT i.display_item_id)
FROM search_index_item i
WHERE i.path LIKE '238/2/257/%'
AND i.scope_id = v.scope_id
AND CONCAT('i.attribute_', v.attribute_id) LIKE CONCAT('%|', v.attribute_value_id, '|%')
)
AS item_count
FROM search_index_category_attribute_value v
WHERE v.category_id = 257
查询工作到目前为止的工作正常,但是计算出的" item_count"始终是0字段名称。当我用良好的列名替换此语句时,它返回一个值:
SELECT
v.*,
(
SELECT COUNT(DISTINCT i.display_item_id)
FROM search_index_item i
WHERE i.path LIKE '238/2/257/%'
AND i.scope_id = v.scope_id
AND i.attribute_7 LIKE CONCAT('%|', v.attribute_value_id, '|%')
)
AS item_count
FROM search_index_category_attribute_value v
WHERE v.category_id = 257
这现在有效,但是当然仅适用于单个属性(7)。由于属性ID存储在另一个表中,然后将单列保存在非归一化表中以进行性能目的,因此我需要动态创建列名。当然,我可以在代码中做到这一点,但这相当缓慢且不需要。
你们是否有想法强制mysql处理" concat('i.attribute_',v.attribute_id)"作为字段而不是字符串?
预先感谢您!
您的数据模型有缺陷。
如果您无法标准化数据,请尝试重写此子句:
AND CONCAT('i.attribute_', v.attribute_id) LIKE CONCAT('%|', v.attribute_value_id, '|%')
进入这个怪物:
AND CASE v.attribute_id
WHEN 1 THEN i.attribute_1
WHEN 2 THEN i.attribute_2
WHEN 3 THEN i.attribute_3
WHEN 4 THEN i.attribute_4
.......
.......
.......
WHEN 998 THEN i.attribute_998
WHEN 999 THEN i.attribute_999
WHEN 1000 THEN i.attribute_1000
END
LIKE CONCAT('%|', v.attribute_value_id, '|%')
这可能会起作用,但是它不会很快 - 此查询必须始终进行全表扫描,不能使用任何索引。