1

私は2つのテーブル「USERS」と「CALENDER」を持っています。カレンダーテーブルのユーザーは、利用可能日を配置します。これは、1対多の関係を意味します。

今、私は利用可能日(今日の日付は今日利用可能であることを意味します)でユーザーリストを取得したいと思います。つまり、今日利用可能なユーザーを一番上に表示し、次に将来利用可能になるユーザーを表示し、次に利用できないユーザーを表示したいt可用性(つまり、カレンダーに記録がない)。

私は以下のクエリで試しています:

SELECT u.first_name, c.date
FROM  users AS u
LEFT JOIN calendar AS c ON (c.uid = u.id)
GROUP BY u.id
ORDER BY DATE(c.date) ASC

しかし、これにより、カレンダーで可用性を持たないユーザーから始めて、次に可用性はあるが過去のユーザーによって記録が得られます。結果を以下に示します。

User1   NULL                                          User13    2012-12-12 00:00:00
User2   NULL                                          User12    2012-12-12 00:00:00
User3   NULL                                          User10    2012-12-23 00:00:00                      
User4   NULL                                          User10    2012-12-24 00:00:00
User5   NULL                                          User9     2012-12-25 00:00:00
User6   NULL                 - Want To look this =>   User8     2012-12-27 00:00:00
User7   2012-09-20 00:00:00                           User7     2012-12-28 00:00:00
User8   2012-09-29 00:00:00                           User1     NUL
User9   2012-10-25 00:00:00                           User2     NUL
User10  2012-10-26 00:00:00                           User3     NUL
User11  2012-10-27 00:00:00                           User4     NUL
User12  2012-12-05 00:00:00                           User5     NUL
User13  2012-12-10 00:00:00                           User6     NUL
4

4 に答える 4

1

ORDER BY句を次のように変更します

ORDER BY IF(DATE(c.date) IS NULL, 1, 0), DATE(c.date)
于 2012-12-12T07:28:48.630 に答える
1

そんなに考えずに、使ってソート順を逆にしてみたことがありますか?

... ORDER BY DATE(c.date) DESC

DESCこれは、明示的な(そしてデフォルトの)エンディングではなく、エンディングをソートしますASC

于 2012-12-12T07:29:02.573 に答える
0

IF関数を使用して、null値を、必要に応じて並べ替えられる他の値にマップします。たとえば、はるか昔の日付や、それが機能する場合は文字列などです。

http://www.java2s.com/Code/SQL/Function/MappingNULLValuestoOtherValuesforDisplay.htm

于 2012-12-12T07:36:54.737 に答える
0

この問題は、サブクエリを入力して将来の日付を取得することで解決できます。昇順の形式では、問題とまったく同じように表示されます。つまり、利用可能なすべての日付レコードが一番上に表示され、次に将来のレコードが表示され、null値が表示されます(誰かがカレンダーの日付)。

SELECT u.first_name, 
 (
  SELECT DATE( c.date ) FROM calendar AS c
  WHERE c.uid = u.id
  AND DATE( c.date ) >= CURDATE( )
  ORDER BY DATE( c.date ) ASC
  LIMIT 1
) AS availability
FROM users AS u
GROUP BY u.id
ORDER BY IF( availability IS NULL , 1, 0 ) , availability
于 2012-12-12T08:12:46.587 に答える