2017-07-02 4 views
0

テーブルは、ある行が特定の月を表し、各列が1日である月の各日の使用可能度ステータスデータで構成されます。 「Available」、「Unavailable」などのステータスを格納します。テーブルの行をマージする

これは、週単位でデータを表示するまで有効です。私が遭遇する問題は、次の月に入る週になるときです。次のようになります

$query = "SELECT pilots.id AS pid, " 
     . "pilots.last_name AS last_name, " 
     . "pilots.first_name AS first_name, " 
     . "rt.* FROM pilots " 
     . "LEFT JOIN (" 
     . "SELECT * FROM availability " 
     . "WHERE date ='" 
     . $first_date_of_month->format("Y-m-d") 
     . $next_month_str . "')rt " 
     . "ON pilots.id = rt.pilot_id " 
     . "ORDER BY pilots.last_name, pilots.first_name, pid"; 

SELECT p.id pid 
    , p.last_name 
    , p.first_name 
    , rt.* 
    FROM pilots p 
    LEFT 
    JOIN 
    (SELECT * 
     FROM availability 
     WHERE date ='2017-06-01' 
     OR date = '2017-07-01' 
    )rt 
    ON p.id = rt.pilot_id 
ORDER 
    BY p.last_name 
    , p.first_name 
    , pid 

問題これとの私は1人のユーザーとデータの2ヶ月を持って言わせている今、私は次のようなクエリを使用しています。 2行を返します。実際には、1ヶ月の終わりから別の月の初めまでの列を使用してデータがマージされる1行だけが必要です。例えば

:(ない月末の7日以内に)最初の例では

//Pilots 
------------------------- 
| id|first_name|last_name| 
------------------------- 
| 1 | "myTest" |"myTest" | 
------------------------- 

// Months 
---------------------------------------------------------------------- 
| id|pilot_id| date | 1_status | 2_status |....| 30_status | 
|--------------------------------------------------------------------| 
| 1 | 1 |3/1/2017| "Available" |"Unavailable"|....| "Available" | 
|--------------------------------------------------------------------| 
| 2 | 1 |4/1/2017|"Unavailable"|"Unavailable"|....|"Unavailable"| 
---------------------------------------------------------------------- 

、それは簡単です:私は来月必要はありません知っているので、私は1つのレコードを持っています。 「3/21/2017」としましょう。 "3/21/2017"、 "3/22/2017"などのステータスを出力するだけです。

ただし、表示する週は「2014年3月28日」から始まるとします。私は3月から4月までのデータが必要です。この場合、pilot_id 1の2行のデータが生成されますが、実際には28_status、29_status、30_status、31_statusが必要で、1_status、2_status(4月以降)が必要です。以下

添付の$ next_month_str:

  $next_month_str = ""; 
      if (!is_last_day_of_month($sunday_date)) 
      { 
       $next_month = get_next_month($monday_date); 
       $next_month_str = "' OR date = '"; 
       $next_month_str = $next_month_str . $next_month->format("Y-m-d"); 
       $next_month_str = $next_month_str; 
      } 

$query_inner = "SELECT pilot_id, 26_status, 27_status, 28_status, 29_status, 30_status FROM availability WHERE date = '2017-06-01'"; 
$query = "SELECT availability.pilot_id AS pid, rt.26_status, rt.27_status, rt.28_status, rt.29_status, rt.30_status, availability.1_status, availability.2_status FROM availability INNER JOIN (" . $query_inner . ")rt ON rt.pilot_id = pid WHERE date = '2017-07-01'"; 

私が思いついた2つのクエリがあります。分離していればうまく動作し、SQLチェッカーを使用してテストするとうまく動作します。しかし、私は自分のサイトでそれを実行すると、彼らは私にエラーをデータベースにクエリを与える。

+1

あなたの質問を編集し、サンプルデータと希望する結果を提供してください。それはあなたが達成したいと思っているもののはるかに良い説明になるでしょう。 –

+0

私は '$ next_month_str'という目的があなたのSQLステートメントにあるのかよくわかりませんが、読みやすく、混乱させるために書き直そうとしました。 –

+1

通常、デザインが正しくないので、これらのことは困難です。ゴードンが尋ねるようにしてください。私たちは両方であなたを助けることができるかもしれません。 – twoleggedhorse

答えて

0

質問に基づいて、GROUP BY,HAVING、おそらくGROUP_CONCAT()を使用して、結果セットを本質的に「平坦化」する必要があります。ここでいくつかのリソースがありますので、どのようにしてその知識を適用するかを学ぶことができます。

上記のリソースを使用すると、SQL文で遊んでみてくださいためのサンドボックスを持っています。

+0

私の質問にそれを加えました。上記をご覧ください。 – keelerjr12

+0

あなたが探しているものを達成するために必要なリソースを提供するために私の答えを更新しました。 –

+0

複数のJOINはどうですか? – keelerjr12

0

解決済み

私はプログラムでクエリ文字列を作成できますが、JOINを使用して解決できました。私はそれが欲しいものを正確にしますか?

SELECT availability.pilot_id, rt.26_status, rt.27_status, rt.28_status, rt.29_status, rt.30_status, availability.1_status, availability.2_status FROM availability INNER JOIN (SELECT pilot_id, 26_status, 27_status, 28_status, 29_status, 30_status FROM availability WHERE date = '2017-06-01')rt ON rt.pilot_id = availability.pilot_id WHERE date = '2017-07-01' 

EDIT:ここでは文字列の例です。私はこれを使って質問を解決することができましたが、最終的にはこれを強制的に設計上の問題でした。私はリファクタリングを行い、可用性{id、pilot_id、date、status}のようなテーブルを使用することにしました。

+1

idはここでは役に立たないようです。 '(pilot_id、date)'はUNIQUEでなければならず、代理を冗長にする必要があります。 – Strawberry

+0

@Strawberry、さらに改善されました。私はスキップすることを決めたDBデザインクラスを大学で受けたはずです。ありがとう! – keelerjr12

+0

あなたはあまりお見逃しなく – Strawberry

関連する問題