gpt4 book ai didi

MySQL:在子查询的 WHERE 语句中使用 CONCAT() 作为列名

转载 作者:行者123 更新时间:2023-11-30 23:06:57 29 4
gpt4 key购买 nike

这是我关于 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。其 0 的原因是语句“CONCAT('i.attribute_', v.attribute_id)”似乎没有被处理为字段名称。当我用好的列名替换此语句时,它返回一个值:

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

这现在有效,但当然只适用于单个 attribute_id (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, '|%')

这可能会奏效,但速度不会很快 - 此查询必须始终执行全表扫描,它不能使用任何索引。

关于MySQL:在子查询的 WHERE 语句中使用 CONCAT() 作为列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21476876/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com