テーブルは、ある行が特定の月を表し、各列が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チェッカーを使用してテストするとうまく動作します。しかし、私は自分のサイトでそれを実行すると、彼らは私にエラーをデータベースにクエリを与える。
あなたの質問を編集し、サンプルデータと希望する結果を提供してください。それはあなたが達成したいと思っているもののはるかに良い説明になるでしょう。 –
私は '$ next_month_str'という目的があなたのSQLステートメントにあるのかよくわかりませんが、読みやすく、混乱させるために書き直そうとしました。 –
通常、デザインが正しくないので、これらのことは困難です。ゴードンが尋ねるようにしてください。私たちは両方であなたを助けることができるかもしれません。 – twoleggedhorse