合并表中的行

问题描述:

我的表格包含每月每天的可用性状态数据,其中一行代表给定月份,每列代表一天。我存储“可用”,“不可用”等状态。合并表中的行

这很好,直到我想按周显示数据。我遇到的问题是当我进入下个月的一个星期。现在,我使用的查询,看起来像:

$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检测器测试他们,他们正是我想要的。但是,当我在我的网站上运行它时,他们给我一个查询数据库的错误。

+1

编辑您的问题,并提供样本数据和预期结果。这将是你想要完成的更好的解释。 –

+0

我不确定你的SQL语句中'$ next_month_str'的​​用途是什么,我试图重写它以使它更易读但更困惑。 –

+1

通常这些事情很难,因为设计不对。按照戈登的要求,我们可以帮助你们两个。 – twoleggedhorse

根据您的问题,您需要使用GROUP BY,HAVING和可能的GROUP_CONCAT()来实质上“展平”您的结果集。这里有一些资源,所以你可以学习如何应用这些知识。

以上矿产资源有一个沙箱为您尝试玩的SQL语句。

+0

添加到我的问题。请参阅上文。 – keelerjr12

+0

我已经更新了我的答案,以提供您需要的资源来完成您正在寻找的内容。 –

+0

多JOINs怎么样? – keelerjr12

解决了它。

我可以以编程方式构建查询字符串,但使用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,日期,状态}。

+1

id似乎没有用处。 '(pilot_id,date)'必须是唯一的,使得代理变得多余。 – Strawberry

+0

@Strawberry,进一步改进。猜猜我应该参加那个大学的DB设计课,我决定跳过。谢谢! – keelerjr12

+0

你没有错过太多 – Strawberry