合并表中的行

时间:2017-07-02 22:47:46

标签: php mysql sql

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

这种方法很有效,直到我想按周显示数据。我遇到的问题是当我到达下个月的一个星期。现在我正在使用看起来像这样的查询:

$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检查器测试它们时它们工作正常,它们完全按照我的意愿行事。但是,当我在我的网站上运行它时,他们会在查询数据库时给我一个错误。

2 个答案:

答案 0 :(得分:0)

根据您的问题,您需要使用GROUP BYHAVINGGROUP_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}这样的表。

相关问题