【问题标题】:MySQL: Use CONCAT() as a colum name in WHERE statement of a sub queryMySQL:在子查询的 WHERE 语句中使用 CONCAT() 作为列名
【发布时间】:2014-02-23 23:01:15
【问题描述】:

这是我关于 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)”作为字段而不是字符串处理吗?

提前谢谢你!

【问题讨论】:

  • 虽然很高兴看到你做了什么,并且你已经努力自己解决问题,但同时提供适当的 DDL(和/或 sqlfiddle)也很有用所需的结果集,以便我们更好地了解您实际尝试执行的操作。 (有点失望,这么长时间的追随者还没有掌握这一点)

标签: mysql subquery concat


【解决方案1】:

您的数据模型存在缺陷。
如果你不能规范化数据,那么尝试重写这个子句:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 2015-02-18
    • 2023-02-07
    • 2013-03-09
    • 1970-01-01
    相关资源
    最近更新 更多