нужна помощь с запросом MySQL - PullRequest
0 голосов
/ 08 февраля 2011

1-й фрагмент фоновой инфы: речь идет о cms, который содержит отношения объект-объект и их сортировку в одной таблице, столбцы: object_id, parent_id и порядок сортировки

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

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

Спасибо!

РЕДАКТИРОВАТЬ: я мог бы обойти проблему, если бы я мог найти альтернативный способ включить родителей в сортировку в запросе. Есть ли такой способ?

Ответы [ 3 ]

1 голос
/ 08 февраля 2011

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

  (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;
0 голосов
/ 08 февраля 2011

Я думаю, вам нужно ввести это (включая obj_asset to 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 )
0 голосов
/ 08 февраля 2011

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

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

Запустите эту часть, и вам повезет с этим.

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

...