2011-02-07 4 views
0

первого куска фона инфа: Это о СХ, которая держит объект - объектные отношения и их сортировку в одной таблице, столбцы object_id, parent_id и порядок сортировканужна помощь с MySQL Query

второго куска есть запрос с несколькими соединений , который я хочу отсортировать по 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' в 'где предложение'

Как я могу заставить его работать?

Спасибо!

EDIT: я мог бы решить проблему, если бы мог придумать альтернативный способ включения родителей в запрос. Есть ли такой способ?

+0

Вы уверены, что вы object_id столбец в таблице obj_asset? – KomarSerjio

+0

Сообщение об ошибке является довольно хорошим ключом в этом случае. (Возможно, вам придется использовать стиль наименования 'tablename.fieldname', если интерпретатор пытается использовать неправильное поле object_id.) :-) –

+0

@KomarSerjio - да, я - как вы можете видеть, это не единственное место, в котором я использовал ту же таблицу столбцов и, если он меняет его для фактического id. @middaparka - Я понимаю, почему возникает ошибка - в контексте внутреннего выбора нет obj_asset.object_id, поскольку он еще не выбран ... Но как я могу исправить это только одним запросом? –

ответ

1

Как вы уже поняли, проблема заключается в том, что вы пытаетесь использовать столбец из внешнего запроса в ограничении подзапроса:

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

Этот подзапрос можно переписать, б ut неясно, как при просмотре только исходного запроса.

Существует, вероятно, ошибка в вашем исходном запросе (переформатировать):

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 не используется в любой присоединиться или где положение.

Мой догадка является то, что вы хотите, чтобы следующее:

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

человек, я мог бы поцеловать тебя прямо сейчас: P. Это именно то, что мне нужно. Только одна ошибка - должна была быть (SELECT o1.sort_order .... Спасибо! –

+0

Я рад, что это помогло - нет поцелуев, пожалуйста, upvoting достаточно :-) – marapet

+0

Готово и принято. Еще раз спасибо. –

0

Ваш подзапрос не содержит obj_asset в предложении FROM.

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

Получите эту часть, и вам будет лучше повезло со всем.

Просто подсказка ... если вы добавите несколько новых строк и отступов в своих операторах SQL, вам будет легче обнаружить проблемы.

+0

meh? да .. я знаю, в чем проблема. Я просто не могу придумать, как это исправить. –

+0

oops, я имел в виду предложение FROM. Попробуйте 'SELECT parent_id FROM object_object, obj_asset WHERE object_object.object_id = obj_asset.object_id' – Nathan

+0

Как я ответил SVGreg - это вызовет новые проблемы, поскольку parent_id не является столбцом obj_asset, и если бы это было так, то select вернул бы несколько строк, где Мне нужен только один. –

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) 
+0

nope. что создает целый ряд проблем, поскольку в obj_asset нет родительского элемента, и он также возвращает более 1 строки. –

Смежные вопросы