2011-10-28 4 views
5

によって順序が私のようなテーブルを持っている:SQL文の

table A 
id name email 
1 test1 [email protected] 
2 test2 [email protected] 
3 test3 [email protected] 
4 test4 .... 
5 test5 .... 

table B 
id catA catB year member 
1 false true 2011 2 
2 true false 2011 3 
3 fals true 2010 5 

を、私は、テーブルAのすべての行を取得し、次でそれをソートしたい:

FIRST, get user 2 (current year, based on table B) 
SECOND, get user 3 (current year, based on table B) 
after that get users that is in table B 
after that get all other users. 

私は私ができることを知っています最初の2人のユーザーを取得するための特定のSQLを持っており、ちょうど が残ります。しかし、私はステートメントで良いORDERでそれらをすべて得ることができないはずですか? 1行目のステートメントを1行目に限定するのと同じように...

+1

質問に対する回答がある場合は、同意してください。 –

答えて

4

これはなんですか?

select A.id, A.name, A.email, B.catA, B.catB, B.year 
from A 
join B on A.id = B.member 
ORDER BY B.year DESC, (B.member IS NOT NULL) DESC 

まずソートあなたを取得、テーブルBで年フィールド、すべての結果は、2011年、2010年、等...テーブルBにリストされていないメンバーはの底に並べ替えヌル年を持っていますリスト。次のsort by B.memberはnullではありません - mysqlはこのブール結果を整数1または0に強制します。これはソート可能です。したがって、1をソートしてすべての1(ヌルB.members以外)を最初にソートします。あなたの並べ替えルールに基づいて

+0

オールマット: ORDER BY(tableb.year IS NULL)ASC、(tableb.member IS NOT NULL)DESC。 それが一番正しいのですが、今問題はB.catAを最初に取得し、次にB.catBを取得したいということです。また可能ならば、catAとcatBの最新情報だけが必要です。その次は順序が問題ではありません。 – joxxe

+0

ORDER BY(CASE tableB.year)(1年前から今すぐ)THEN 0 ELSE 1 END)ASC、tableA.id desc; – joxxe

0

after that get users that is in table B 
after that get all other users. 

私はあなたがJOINをLEFTを使用したいと思いますので、Bには存在しないテーブルAの一部のユーザーがあることを前提としています。あなたはいつも「で注文が」しかし、グロテスクあなたの選択を複雑にすることができます

SELECT a.id, a.name, a.email 
    FROM a 
     LEFT JOIN b 
      ON a.id = b.member 
    ORDER BY ISNULL(b.year), b.year DESC, a.name 
0

され、そこから選択し、派生テーブルにデータ収集要素を入れて購入し、その結果によって発注。以下のような何か...

SELECT col1, 
     col2, 
     col3 
    FROM 
     (SELECT 1 as col1, 
       col2, 
       ' ' AS col3 
      FROM blah...blah...blah 
      UNION 
     SELECT 2 AS col1 
       col2, 
       col3 
      FROM blah...blah...blah 
      UNION 
     and so on) myderivedtable 
    ORDER BY col1, 
      col2, 
      col3 

あなたはちょうどあなたがクエリのそれぞれに選択されているすべての列が同じに出てくる、またはそれ以外の場合はNULL値に対処することを確認する必要があります。