2009-08-19 10 views
2

私の構文は明らかに3つの場合すべて正しいですが(PostgreSQLは何も言及していませんが)、これらの3つのクエリすべてで同じ結果が返されます。見知らぬ人でも、次のいずれかからDESCを追加/削除しても影響はありません。サブクエリの要素に基づいて結果をソートすることは可能ですか?サブクエリとソート? (ORDER BY)

Sort by affiliation 
SELECT * FROM articles_view WHERE (1=1) 
AND spubid IN 
    (SELECT people.spubid FROM people WHERE (people.slast ilike 'doe') 
    GROUP BY people.spubid, people.slast, people.saffil) 
AND spubid IN 
    (SELECT status.spubid FROM status WHERE ((status.imonth >= 01 OR status.imonth IS NULL) AND status.iyear >= 2000) AND ((status.imonth <= 01 OR status.imonth IS NULL) AND status.iyear <= 2008) ORDER BY status.iyear, status.imonth) 

Sort by last name, descending order 
SELECT * FROM articles_view WHERE (1=1) 
AND spubid IN 
    (SELECT people.spubid FROM people WHERE (people.slast ilike 'doe') 
    GROUP BY people.spubid, people.slast, people.saffil ORDER BY people.slast DESC) 
AND spubid IN 
    (SELECT status.spubid FROM status WHERE ((status.imonth >= 01 OR status.imonth IS NULL) AND status.iyear >= 2000) AND ((status.imonth <= 01 OR status.imonth IS NULL) AND status.iyear <= 2008)) 

Sort by year/month descending order 
SELECT * FROM articles_view WHERE (1=1) 
AND spubid IN 
    (SELECT people.spubid FROM people WHERE (people.slast ilike 'doe') 
    GROUP BY people.spubid, people.slast, people.saffil) 
AND spubid IN 
    (SELECT status.spubid FROM status WHERE ((status.imonth >= 01 OR status.imonth IS NULL) AND status.iyear >= 2000) AND ((status.imonth <= 01 OR status.imonth IS NULL) AND status.iyear <= 2008) ORDER BY status.iyear, status.imonth DESC) 

なぜORDER BY条件が結果の順序に影響しないのか分かりません。

********* UPDATE:私は私のすべてのソートを行うには(この場合はarticles_viewに)私の見解では、アレイの列を使用していたやってしまった何を

。そのようにして、私はすべての種類をプライマリクエリの「列」で行い、JOINSを使用する必要はありません。ビューが定義されている方法では、people/statusテーブル内の特定のpubid(プライマリキー)に一致するすべてのカラム(どちらも1 - > many)がビューの配列カラムに格納されます。私はいつも、主である配列の最初のメンバー(Postgresの中で最初のインデックスではなく、通常0以上1である)ことを知っているので、これは働く理由がある

SELECT * FROM articles_view WHERE 
    ((articles_view.skeywords_auto ilike '%ice%') OR (articles_view.skeywords_manual ilike '%ice%')) 
    ORDER BY (articles_view.authors[1]).slast 

:ソートと私のクエリは次のようになります私がソートするために必要な著者(または主要なステータス)。

答えて

0

私は何をやってしまったことは、この中で(私の見解では、配列の列を使用していましたcase articles_view)私の並べ替えをすべて行います。そのようにして、私はすべての種類をプライマリクエリの「列」で行い、JOINSを使用する必要はありません。ビューが定義されている方法では、people/statusテーブル内の特定のpubid(プライマリキー)に一致するすべてのカラム(どちらも1 - > many)がビューの配列カラムに格納されます。私はいつも、主である配列の最初のメンバー(Postgresの中で最初のインデックスではなく、通常0以上1である)ことを知っているので、これは働く理由がある

SELECT * FROM articles_view WHERE 
    ((articles_view.skeywords_auto ilike '%ice%') OR (articles_view.skeywords_manual ilike '%ice%')) 
    ORDER BY (articles_view.authors[1]).slast 

:ソートと私のクエリは次のようになります私がソートするために必要な著者(または主要なステータス)。

3

すべてのサブクエリが実行しているのは、spubidの存在をチェックする条件の結果セットを提供することです。実際にステータステーブルに参加してから、外部クエリのorder by句に列を使用する必要があります。以下のような

何か:

SELECT * 
FROM articles_view 
     INNER JOIN status ON articles_view.spubid = status.spubid 
     INNER JOIN people ON articles_view.spubid = people.spubid 
WHERE ((status.imonth >= 01 OR status.imonth IS NULL) AND status.iyear >= 2000) 
     AND ((status.imonth <= 01 OR status.imonth IS NULL) 
     AND status.iyear <= 2008 AND people.slast ilike 'doe') 
ORDER BY status.iyear, status.imonth 
+0

私が恐れていたことですが、実際にはジョインを使用しないようにしたい(プロダクトが大きくなりすぎるため、代わりにサブクエリを使用する)。 –

+0

内部結合を使用すると、適切な結果のみが得られ、クエリオプティマイザは、結合が適用される前にwhere句を満たしていないものを取り除くプランを決定する必要があります。 –

1

は、あなただけのINステートメントで使用されているデータをソートしています。最上位のSelectステートメントをソートする必要があります。

編集:

とIn句の内部Select文は、検索結果の全体的なソートに貢献していないので、あなたは、このように不要な操作を行う必要性からサーバーを防ぎ、それらから句によって順序を削除する必要があります処理。

2

アウタークエリを注文していません。 内部クエリのみを注文しています。それは完全に合法ですが、その内側の結果で行っているのは、spubidをそれらと比較することです。その順序はそれほど重要ではありません。

あなたが探しているのはJOINです。

SELECT * 
FROM articles_view 
INNER JOIN status ON (status.spubid = articles_view.spubid AND ((status.imonth >= 01 OR status.imonth IS NULL) AND status.iyear >= 2000) AND ((status.imonth <= 01 OR status.imonth IS NULL) AND status.iyear <= 2008)) 
WHERE spubid IN 
    (SELECT people.spubid FROM people WHERE (people.slast ilike 'doe') 
    GROUP BY people.spubid, people.slast, people.saffil) 
ORDER BY status.iyear, status.imonth DESC 

(あなたも参加するなど、他のルックアップを書き換えることができますが、単純化のために私は1つだけであること、左。)

+0

私は、ユーザーが人または状態テーブルのフィールドを並べ替えるかどうかを事前に知っていないので、私は両方に参加する必要があります。問題は、私が残した製品です。その多くのデータをクエリに組み込む必要はありませんが、幅広い種類の並べ替えオプションを許可したい場合、それが私の唯一の選択肢であるように思えます。 –

+1

あなたは 'JOIN'であろうとなかろうと、多くのデータを*処理*に組み込んでいます。あなたの懸念が、単純にその多くの*列*を返すのであれば、それは簡単に修正されています: 'SELECT *'の代わりに 'SELECT articles_view。*' – VoteyDisciple

関連する問題