2011-02-07 106 views
0

1件背景INF的:这是关于持有对象CMS - 客体关系及其在单表的排序,列OBJECT_ID,PARENT_ID和排序顺序需要帮助与MySQL查询

第二张有若干个连接查询,我想按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 - 未知列'obj_asset.object_id 'where子句'

我怎样才能得到它的工作?

谢谢!

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

+0

你确定你已经在obj_asset表OBJECT_ID列? – KomarSerjio 2011-02-07 21:12:58

+0

错误信息在这个例子中是一个很好的线索。 (如果解释器尝试使用错误的object_id字段,则可能必须使用`tablename.fieldname`命名样式。):-) – 2011-02-07 21:14:14

+0

@KomarSerjio - 是的,我 - 你可以看到,它不是唯一的地方,我使用相同的列和表,它的工作原理,如果我改变它的实际ID。 @middaparka - 我明白为什么会出现错误 - 在内部选择的上下文中,没有obj_asset.object_id,因为它尚未被选中......但是我怎样才能解决这个只有一个查询? – 2011-02-07 21:18:00

回答

1

正如你已经想通了,问题是,你正在尝试在子查询约束中使用外部查询中的列:

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

此子查询可以重写,b不知道如何只看你的原始查询。

有可能是你的原始查询错误(格式化):

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; 
0

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

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

让这部分运行,你应该有更好的运气与整个事情。

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

+0

meh?是的..我知道那是问题所在。我只是想不出有什么办法来修复它。 – 2011-02-07 21:25:07

0

我认为你需要键入这个(包括obj_asset从):

(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)