【问题标题】:need help with mysql query在mysql查询方面需要帮助
【发布时间】:2011-02-07 21:08:12
【问题描述】:

第一条背景信息:这是关于保存对象-对象关系及其在单个表中排序的cms,列是object_id,parent_id和排序顺序

第二块有几个连接的查询,我想按 2 个参数排序。其中之一是对象本身的排序,第二个是其父对象的排序顺序。

我现在的查询是:

SELECT obj_asset.*, object.headline AS title, oo.sort_order AS sort, op.sort_order FROM obj_asset 
JOIN object ON obj_asset.object_id = object.object_id 
JOIN object_object AS oo on obj_asset.object_id = oo.object_id
JOIN (SELECT sort_order from object_object WHERE object_id = (SELECT parent_id from object_object WHERE object_id = obj_asset.object_id )) AS op ON obj_asset.object_id = oo.object_id
WHERE obj_asset.profile_id = 140 AND obj_asset.rsvp_enabled = 1 AND object.is_published = 1 ORDER BY sort DESC;

而且它不起作用。不过这很好用:

SELECT obj_asset.*, object.headline AS title, oo.sort_order AS sort, op.sort_order FROM obj_asset 
JOIN object ON obj_asset.object_id = object.object_id 
JOIN object_object AS oo on obj_asset.object_id = oo.object_id
JOIN (SELECT sort_order from object_object WHERE object_id = (SELECT parent_id from object_object WHERE object_id = 11111 )) AS op ON obj_asset.object_id = oo.object_id
WHERE obj_asset.profile_id = 140 AND obj_asset.rsvp_enabled = 1 AND object.is_published = 1 ORDER BY sort DESC;

我得到的错误是:

1054 - “where 子句”中的未知列“obj_asset.object_id”

我怎样才能让它工作?

谢谢!

编辑:如果我能想出替代方法将父母排序到查询中,我可以解决这个问题。有没有这样的方法?

【问题讨论】:

  • 您确定 obj_asset 表中有 object_id 列吗?
  • 在这种情况下,错误消息是一个很好的线索。 (如果解释器尝试使用错误的 object_id 字段,您可能必须使用 tablename.fieldname 命名样式。):-)
  • @KomarSerjio - 是的,我是 - 正如你所看到的,它不是我使用相同列和表的唯一地方,如果我将其更改为实际 ID,它就可以工作。 @middaparka - 我明白为什么会出现错误 - 在内部选择的上下文中,没有 obj_asset.object_id 因为它还没有被选择......但是我怎样才能用一个查询来解决这个问题?

标签: mysql mysql-error-1054


【解决方案1】:

正如您已经发现的那样,问题在于您试图在子查询的约束中使用外部查询中的列:

  (SELECT sort_order
      from object_object
      WHERE object_id = (SELECT parent_id
                         from object_object
                         WHERE object_id = obj_asset.object_id )
     )

这个子查询可以重写,但不清楚如何只查看原始查询。

您的原始查询可能有错误(重新格式化):

SELECT obj_asset.*, object.headline AS title, oo.sort_order AS sort, op.sort_order
FROM obj_asset 
JOIN object ON obj_asset.object_id = object.object_id 
JOIN object_object AS oo on obj_asset.object_id = oo.object_id
JOIN (SELECT sort_order
      from object_object
      WHERE object_id = (SELECT parent_id
                         from object_object
                         WHERE object_id = obj_asset.object_id )
     ) AS op ON obj_asset.object_id = oo.object_id
WHERE obj_asset.profile_id = 140 AND obj_asset.rsvp_enabled = 1 AND object.is_published = 1 ORDER BY sort DESC;

名为op 的子查询未在任何连接或where 子句中使用。

我的最佳猜测是您想要以下内容:

SELECT obj_asset.*, object.headline AS title, oo.sort_order AS sort, op.sort_order
FROM obj_asset 
JOIN object ON obj_asset.object_id = object.object_id 
JOIN object_object AS oo on obj_asset.object_id = oo.object_id
JOIN (SELECT sort_order, o2.object_id
    from object_object as o1
    INNER JOIN object_object as o2 ON o1.object_id = o2.parent_id
    ) AS op ON obj_asset.object_id = op.object_id
WHERE obj_asset.profile_id = 140 AND obj_asset.rsvp_enabled = 1 AND object.is_published = 1 ORDER BY sort DESC;

【讨论】:

  • 伙计,我现在可以吻你了:P。这正是我所需要的。只有一个错误 - 应该是 (SELECT o1.sort_order.... 谢谢!
  • 我很高兴它有帮助 - 请不要接吻,点赞就够了 :-)
【解决方案2】:

我认为你需要输入这个(包括 obj_asset 到 FROM):

(SELECT parent_id FROM object_object, obj_asset  WHERE object_object.object_id = obj_asset.object_id )

但不是这个:

(SELECT parent_id from object_object WHERE object_id = obj_asset.object_id )

【讨论】:

  • 不。这会产生全新的问题,因为 obj_asset 中没有 parent_id 并且它也会返回超过 1 行。
【解决方案3】:

您的子查询在 FROM 子句中不包含 obj_asset。

(SELECT parent_id FROM object_object WHERE object_id = obj_asset.object_id )

让那部分运行起来,你应该对整个事情有更好的运气。

只是一个提示...如果您在 SQL 语句中添加更多换行符和缩进,您会更容易发现问题。

【讨论】:

  • 嗯?是的..我知道这就是问题所在。我只是想不出任何办法来解决它。
  • 哎呀,我的意思是 FROM 子句。试试SELECT parent_id FROM object_object, obj_asset WHERE object_object.object_id = obj_asset.object_id
  • 就像我对 SVGreg 的回答一样——这会引发新问题,因为 parent_id 不是 obj_asset 的列,如果是,那么 select 将返回多行,我只需要一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多