合并表中的行
我的表格包含每月每天的可用性状态数据,其中一行代表给定月份,每列代表一天。我存储“可用”,“不可用”等状态。合并表中的行
这很好,直到我想按周显示数据。我遇到的问题是当我进入下个月的一个星期。现在,我使用的查询,看起来像:
$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行,其中数据使用从一个月末到另一个月末的列进行合并。
例如:
//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”,“3/22/2017”等等的状态。
然而,让我们说我想要显示的一周开始于“3/28/2017”。我需要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'";
有我想出了两个查询。分开他们工作得很好,他们工作得很好,当我用SQL检测器测试他们,他们正是我想要的。但是,当我在我的网站上运行它时,他们给我一个查询数据库的错误。
根据您的问题,您需要使用GROUP BY
,HAVING
和可能的GROUP_CONCAT()
来实质上“展平”您的结果集。这里有一些资源,所以你可以学习如何应用这些知识。
以上矿产资源有一个沙箱为您尝试玩的SQL语句。
解决了它。
我可以以编程方式构建查询字符串,但使用JOINs我能解决它。正是我想要的。下面是一个字符串的例子:
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,日期,状态}。
id似乎没有用处。 '(pilot_id,date)'必须是唯一的,使得代理变得多余。 – Strawberry
@Strawberry,进一步改进。猜猜我应该参加那个大学的DB设计课,我决定跳过。谢谢! – keelerjr12
你没有错过太多 – Strawberry
编辑您的问题,并提供样本数据和预期结果。这将是你想要完成的更好的解释。 –
我不确定你的SQL语句中'$ next_month_str'的用途是什么,我试图重写它以使它更易读但更困惑。 –
通常这些事情很难,因为设计不对。按照戈登的要求,我们可以帮助你们两个。 – twoleggedhorse