2011-02-07 102 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)