0

背景infの最初の部分:これは、オブジェクトを保持するcmsについてです-オブジェクトの関係と単一のテーブルでのそれらの並べ替え、列はobject_id、parent_id、および並べ替え順序です

2番目のピースには、いくつかの結合を含むクエリがあり、2つのパラメーターで並べ替えたいと思います。1つはオブジェクト自体の並べ替えで、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'

どうすれば動作させることができますか?

ありがとう!

編集:親がクエリにソートすることを含める別の方法を思い付くことができれば、問題を回避することができます。そのような方法はありますか?

4

3 に答える 3

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は、joinまたは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;
于 2011-02-07T21:47:23.350 に答える
0

サブクエリのFROM句にobj_assetが含まれていません。

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

その部分を実行してください、そしてあなたはすべてでより良い運を持っているはずです。

ヒント...SQLステートメントに改行とインデントを追加すると、問題を見つけやすくなります。

于 2011-02-07T21:16:21.660 に答える
0

これを入力する必要があると思います(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 )
于 2011-02-07T21:20:22.640 に答える