我的表格包含每月每天的可用性状态数据,其中一行代表给定月份,每列代表一天。我存储“可用”,“不可用”等状态
这种方法很有效,直到我想按周显示数据。我遇到的问题是当我到达下个月的一个星期。现在我正在使用看起来像这样的查询:
$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行。我真的只想要一行使用一个月末和另一个月开始的列合并数据。
例如:
//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"|
----------------------------------------------------------------------
在第一个例子中(不是在月末的7天内),这很简单:我将有1条记录,因为我知道下个月我不需要。让我们说它是“2017年3月21日”;我只输出“3/21/2017”,“2017年3月22日”的状态,依此类推。
但是,让我们说我想要显示的那一周从“2017年3月28日”开始。我需要3月份和4月份的数据。在这种情况下,它为pilot_id 1生成2行数据。但我真的只需要28_status,29_status,30_status,31_status,然后需要1_status,2_status(全部来自四月)。
在下面附上$ 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'";
我想出了两个问题。它们分开工作正常,当我使用SQL检查器测试它们时它们工作正常,它们完全按照我的意愿行事。但是,当我在我的网站上运行它时,他们会在查询数据库时给我一个错误。
答案 0 :(得分:0)
根据您的问题,您需要使用GROUP BY
,HAVING
和GROUP_CONCAT()
来基本上“展平”您的结果集。这里有一些资源,所以你可以学习如何然后应用这些知识。
上面的资源有一个沙箱,您可以尝试使用SQL语句。
答案 1 :(得分: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'
编辑:虽然我能够用这个来解决问题,但最终还是设计问题迫使了这一点。我决定重构并使用像{id,pilot_id,date,status}这样的表。