0

私はこのデータベースを持っています: ここに画像の説明を入力

ここで、1 から 28 までの数字はその月の日 (2 月) を表し、1 と 0 はそれぞれ user_bid_id が仕事を休んでいるかいないかを表します。毎週 (つまり、1 から 7、8 から 15、16 から 23 など) で最大人数の休みの日を選択したいと思います。

私は多くの異なるクエリを試しました。

この関数を使用して、その日に誰が利用できるかを確認し、その日の人数を数えることができます。

function checkPublishTraining($month){
     $month = sanitize($month);

if(bidIsPublished($month)){
 if(($month === 'FEB')){
  echo'
 <table>
 <tr id="checkBidding">
 <th>1</th> 
 <th>2</th> 
 <th>3</th> 
 <th>4</th> 
 <th>5</th> 
 <th>6</th> 
 <th>7</th> 
 <th>8</th> 
  <th>9</th> 
 <th>10</th> 
 <th>11</th> 
 <th>12</th> 
 <th>13</th> 
 <th>14</th> 
 <th>15</th> 
 <th>16</th> 
 <th>17</th> 
 <th>18</th> 
 <th>19</th> 
 <th>20</th> 
 <th>21</th> 
  <th>22</th> 
  <th>23</th> 
  <th>24</th> 
  <th>25</th> 
  <th>26</th> 
  <th>27</th> 
  <th>28</th> 
  </tr>
   <tr>';
          $i = 1;

    while ( $i <= 28 ) {
       $count = mysql_query("SELECT COUNT(`$i`)as days FROM $month WHERE `$i` = '1'");
       $num = mysql_fetch_array($count);

       echo'<td>';
       $names = mysql_query("SELECT user_bid_id FROM $month WHERE `$i` = '1'");
       while($row = mysql_fetch_array($names)){
       $name = firstName_from_id($row['user_bid_id']);
       echo '<h5>'.$name.'</h5>';
                    }

        echo'<h5>'.$num['days'].'</h5>';
         $i++;

       echo '</td>';

       }

       echo'</tr></table>';
       }
          }

             }

このテーブルを返します:

ここに画像の説明を入力

より多くのメンバーが参加する日を選択することはできますが、すべてのメンバーに月に最低 1 回のトレーニング セッションを提供しようとしていますか?

4

2 に答える 2

1

これを正しく行うには、MySQLがサポートしていないデータをUNPIVOTする必要があります。したがって、UNION ALLを使用してピボットされていないデータを返すビューを作成できます(以下のクエリを表示)。このビューを取得したら、次の操作を実行できます。

SELECT myView.week, myView.day
FROM (
  SELECT week, max(total) as total
  FROM myView
  GROUP BY week) s
JOIN myView
  ON s.week = myView.week
  AND s.total = myView.total

コメントに記載されているように、複数の日が1週間の最大値が同じである場合、1週間に複数の結果が得られる可能性があります。

そして、これがビュークエリです:

CREATE myView AS
SELECT 1 as week, 1 as day, SUM(`1`) as total
FROM tableName
UNION ALL
SELECT 1, 2, SUM(`2`)
FROM tableName
UNION ALL
SELECT 1, 3, SUM(`3`)
FROM tableName
UNION ALL
SELECT 1, 4, SUM(`4`)
FROM tableName
UNION ALL
SELECT 1, 5, SUM(`5`)
FROM tableName
UNION ALL
SELECT 1, 6, SUM(`6`)
FROM tableName
UNION ALL
SELECT 1, 7, SUM(`7`)
FROM tableName
UNION ALL
SELECT 2, 1, SUM(`8`)
FROM tableName
UNION ALL
SELECT 2, 2, SUM(`9`)
FROM tableName
UNION ALL
SELECT 2, 3, SUM(`10`)
FROM tableName
UNION ALL
SELECT 2, 4, SUM(`11`)
FROM tableName
UNION ALL
SELECT 2, 5, SUM(`12`)
FROM tableName
UNION ALL
SELECT 2, 6, SUM(`13`)
FROM tableName
UNION ALL
SELECT 2, 7, SUM(`14`)
FROM tableName
UNION ALL
SELECT 3, 1, SUM(`15`)
FROM tableName
UNION ALL
SELECT 3, 2, SUM(`16`)
FROM tableName
UNION ALL
SELECT 3, 3, SUM(`17`)
FROM tableName
UNION ALL
SELECT 3, 4, SUM(`18`)
FROM tableName
UNION ALL
SELECT 3, 5, SUM(`19`)
FROM tableName
UNION ALL
SELECT 3, 6, SUM(`20`)
FROM tableName
UNION ALL
SELECT 3, 7, SUM(`21`)
FROM tableName
UNION ALL
SELECT 4, 1, SUM(`22`)
FROM tableName
UNION ALL
SELECT 4, 2, SUM(`23`)
FROM tableName
UNION ALL
SELECT 4, 3, SUM(`24`)
FROM tableName
UNION ALL
SELECT 4, 4, SUM(`25`)
FROM tableName
UNION ALL
SELECT 4, 5, SUM(`26`)
FROM tableName
UNION ALL
SELECT 4, 6, SUM(`27`)
FROM tableName
UNION ALL
SELECT 4, 7, SUM(`28`)
FROM tableName
于 2013-02-13T18:16:40.113 に答える
0

列ごとにすべての行の値を合計し、値をグループ化するために DAYOFWEEK の日付の列を変更します

于 2013-02-13T17:50:34.790 に答える