5

同様の投稿が見つかりましたが、まだスタックしています - クエリを処理して結果を制限した後、並べ替えを適用しようとしています。私のコードは

select DISTINCT(t.id) t_id, t.cart_id ,tS.id tS_id, tS.created tS_created, t.value, t.transactionType_id tT_id, tS.member_name, outIn, tT.type type

                            from(transaction t)
                            join transactionSummary tS ON tS.id = t.transactionSummary_id
                            left join transactionType tT ON tT.id = t.transactionType_id
                            order by t.id DESC
                            limit 50

その後、サブセレクトを実行して ORDER BY を適用しようとしましたが、「フィールド リスト」の列「t.id」が不明であるというエラーが表示されます。

上記のコード (つまり、サブ選択なし) は正常に動作しますが、テーブルが巨大であるため、ORDER BY によって速度が低下します...何か提案はありますか?

4

1 に答える 1

4

にエイリアスt.idt_idているため、外側のクエリでエイリアスを使用する必要があります。

SELECT *
FROM (select DISTINCT t.id t_id, t.cart_id ,tS.id tS_id, tS.created tS_created, t.value, t.transactionType_id tT_id, tS.member_name, outIn, tT.type type

    from transaction t
    join transactionSummary tS ON tS.id = t.transactionSummary_id
    left join transactionType tT ON tT.id = t.transactionType_id
    limit 50) x
ORDER BY t_id DESC

ところで、あなたが書いた方法はDISTINCT(t.id)、個別の操作がその1つの列にのみ適用されていると考えていることを示唆しています。リストDISTINCT全体に適用されます。SELECT特定の列のみを区別したい場合は、 を使用GROUP BYしてそれらの列を指定する必要があります。

クエリを高速化するために書き直す方法を次に示します。

select DISTINCT t.id t_id, t.cart_id ,tS.id tS_id, tS.created tS_created, t.value, t.transactionType_id tT_id, tS.member_name, outIn, tT.type type
from transaction t
join (select max(id)-500 maxid from transaction) mT on t.id > maxid
join transactionSummary tS ON tS.id = t.transactionSummary_id
left join transactionType tT ON tT.id = t.transactionType_id
order by t_id DESC
limit 50

上位 500 個の ID のみをフィルター処理することで、結合と並べ替えのサイズが縮小されます。

于 2013-10-18T13:48:05.260 に答える