【问题标题】:"Unknown column" because of subquery-in-subquery“未知列”,因为子查询中的子查询
【发布时间】:2010-07-31 14:40:09
【问题描述】:

我需要在子查询中进行子查询是什么导致“'where 子句'中的未知列't1.product_id'”。它在第 7 行。在我的示例中。如何解决这个问题?

SELECT *,product_id id,
    (SELECT GROUP_CONCAT (value ORDER By `order` ASC SEPARATOR ', ') 
    FROM (
        SELECT `order`,value 
        FROM slud_data 
        LEFT JOIN slud_types ON slud_types.type_id=slud_data.type_id 
        WHERE slud_data.product_id = t1.product_id 
          AND value!='' AND display=0 
        LIMIT 3
    ) tmp) text
FROM slud_products t1 
WHERE 
    now() < DATE_ADD(date,INTERVAL +ttl DAY) AND activated=1
    ORDER BY t1.date DESC

这个问题继续LIMIT ignored in query with GROUP_CONCAT

【问题讨论】:

  • 在没有 ORDER BY 子句的情况下,LIMIT 依赖于表索引的底层结构,这(对于某些人来说)有点不可预测。

标签: sql mysql subquery mysql-error-1054


【解决方案1】:

我发现在具有超过 2 个选择深度的查询中使用变量更舒服。

SELECT *,@product := product_id id,
    (SELECT GROUP_CONCAT (value ORDER By `order` ASC SEPARATOR ', ') 
    FROM (
        SELECT `order`,value 
        FROM slud_data 
        LEFT JOIN slud_types ON slud_types.type_id=slud_data.type_id 
        WHERE slud_data.product_id = @product
          AND value!='' AND display=0 
        LIMIT 3
    ) tmp) text
FROM slud_products t1 
WHERE 
    now() < DATE_ADD(date,INTERVAL +ttl DAY) AND activated=1
    ORDER BY t1.date DESC

【讨论】:

  • 不要这样做!!!它不会可靠地工作:你不能保证 SELECT 表达式的从左到右的评估顺序,所以你的子查询可能会对于给定的行,在 之前 @product 被更新。来自手册:“涉及用户变量的表达式的评估顺序未定义。例如,不能保证 SELECT @a, @a:=@a+1 先评估 @a 然后执行赋值。“。 (dev.mysql.com/doc/refman/8.0/en/user-variables.html)。
【解决方案2】:

使用派生表/内联视图和表别名:

  SELECT product_id AS id,
         GROUP_CONCAT (y.value ORDER BY y.`order`) 
    FROM slud_products t1 
    JOIN (SELECT sd.product_id, 
                 sd.value,
                 sd.`order`
            FROM SLUD_DATA sd 
       LEFT JOIN slud_types ON slud_types.type_id = slud_data.type_id 
           WHERE value! = '' 
             AND display = 0) y ON y.product_id = t1.product_id 
                               AND y.order <= 3
   WHERE now() < DATE_ADD(date,INTERVAL +ttl DAY) 
     AND activated = 1
GROUP BY product_id
ORDER BY t1.date DESC

【讨论】:

  • 您好,仍然想知道这里如何处理原始查询中的“LIMIT 3”子句?如果order 不是顺序字段或不是从零开始的怎么办?
  • @Dfr: AND y.order &lt;= 3 是一个分组限制。如果 OP 将此标记为答案,则可以安全地假设 order 是数字...
猜你喜欢
  • 2013-10-20
  • 1970-01-01
  • 2014-04-06
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多