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

MySQL:在子查询的WHERE语句中使用CONCAT()作为列名称,mysql,subquery,concat,Mysql,Subquery,Concat,这是我关于stackoverflow的第一个问题,但到目前为止,我已经读了很多年了。所以,如果我的问题不合适,请原谅。我在网上搜索了几个小时,什么也没找到 我目前正在优化MySQL数据库系统的查询。一个表保存另一个表的总和,以加速前端显示这些总和。我结束的查询正在替换代码中的多个其他查询和循环。。。如果可以的话:) 这是一个未按预期工作的: SELECT v.*, ( SELECT COUNT(DISTINCT i.display_item_id) FROM search_index

这是我关于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_u',v.attribute_uid)”,该语句似乎不作为字段名处理。当我用正确的列名替换此语句时,它将返回一个值:

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
这现在起作用了,但当然只适用于单个属性_id(7)。由于属性ID存储在另一个表中,然后出于性能目的保存为非规范化表中的单个列,因此我需要动态创建列名。当然我可以在代码中这样做,但这是相当缓慢和不必要的

你们知道如何强制MySQL将“CONCAT('i.attribute_uu',v.attribute_uid')作为字段而不是字符串来处理吗


提前谢谢你

您的数据模型有缺陷。
如果无法规范化数据,请尝试重写此子句:

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, '|%')   

这可能会起作用,但不会很快-此查询必须始终执行完整的表扫描,它不能使用任何索引。

虽然看到您所做的事情总是很好,而且您自己也努力解决了问题,但提供适当的DDL(和/或和SQLFIDLE)也很有用以及所需的结果集,以便我们能够更好地了解您实际想要做的事情。(有点失望,这么长时间的追随者还没有领会到这一点)