1

私はテーブルを持っています:

イベント

    ----- + ------------------- +
    | id | eventName |
    ----- + ------------------- +
    | 1 | ボウリング|
    | 2 | クイズ|
    | 3 | ダーツ|
    | 4 | プール|
    | 5 | トレジャーハント|
    | 6 | スヌーカー|
    ----- + ------------------- +

競合他社

    ------ + ------------------ +
    | id | 競合他社名|
    ------ + ------------------ +
    | 1 | Microsoft |
    | 2 | BBC |
    | 3 | Facebook |
    ------ + ------------------ +

結果

    ------ + --------------- + --------- + ------------- +
    | id | 競合他社ID| eventId | eventScore |
    ------ + --------------- + --------- + ------------- +
    | 1 | 1 | 1 | 12 |
    | 2 | 1 | 2 | 11 |
    | 3 | 1 | 3 | 23 |
    | 4 | 2 | 1 | 66 |
    | 5 | 2 | 2 | 12 |
    | 6 | 2 | 3 | 11 |
    | 7 | 2 | 4 | 23 |
    | 8 | 2 | 5 | 66 |
    | 3 | 2 | 6 | 23 |
    | 4 | 3 | 1 | 66 |
    | 5 | 3 | 2 | 12 |
    | 6 | 3 | 3 | 11 |
    | 7 | 3 | 4 | 23 |
    | 8 | 3 | 6 | 66 |
    ------ + --------------- + --------- + ------------- +

そこから私はこのような出力を達成したいと思います:

    -------------- + --------- + --------- + -------- + ------ + -------------- + ----------
    | 競合他社| ボウリング| クイズ| ダーツ|プール|トレジャーハント| スヌーカー|
    -------------- + --------- + --------- + -------- + ------ + -------------- + ----------
    | Microsoft | 12 | 11 | 23 | 0 | 0 | 0 |
    | BBC | 66 | 12 | 11 | 23 | 66 | 23 |
    | Facebook | 66 | 12 | 11 | 23 | 0 | 66 |
    -------------- + --------- + --------- + -------- + ------ + -------------- + ----------

私はあらゆる種類の結合とネストされたphpを試しましたが、それを解読することはできません。それが可能かどうかさえわかりません。私のSQLの知識はあまり良くありません。いくつかのチュートリアルを試しましたが、この種のクエリについては説明していません。

4

5 に答える 5

2
SELECT   competitors.competitorName                          AS competitor,
         SUM(IF(results.eventId = 1, results.eventScore, 0)) AS Bowling,
         SUM(IF(results.eventId = 2, results.eventScore, 0)) AS Quiz,
         -- etc.
FROM     competitors
  LEFT JOIN results ON results.competitorId = competitors.id
GROUP BY competitors.id
于 2012-05-11T09:49:40.880 に答える
1

このリクエストは通常​​は問題ありませんが、テーブルイベントに新しいエントリが追加されるたびに変更する必要があります。

SELECT
    comp.competitorName as competitor,
    rbowling.eventScore as Bowling,
    rquiz.eventScore as Quiz,
    rdarts.eventScore as Darts,
    rpool.eventScore as Pool,
    rtreasure.eventScore as Treasure_Hunt,
    rsnooker.eventScore as Snooker
FROM competitors comp
LEFT JOIN result rbowling ON (rbowling.eventId = 1 AND comp.id = rbowling.competitorId)
LEFT JOIN result rquiz ON (rquiz.eventId = 2 AND comp.id = rquiz.competitorId)
LEFT JOIN result rdarts ON (rdarts.eventId = 3 AND comp.id = rdarts.competitorId)
LEFT JOIN result rpool ON (rpool.eventId = 4 AND comp.id = rpool.competitorId)
LEFT JOIN result rtreasure ON (rtreasure.eventId = 5 AND comp.id = rtreasure.competitorId)
LEFT JOIN result rsnooker ON (rsnooker.eventId = 6 AND comp.id = rsnooker.competitorId)
GROUP BY comp.id;
于 2012-05-11T09:56:49.657 に答える
0

あなたが探しているクエリはこれです:

SELECT r.eventScore, e.eventName, c.competitorName
FROM results r
LEFT JOIN events e ON e.id = r.eventId
LEFT JOIN competitors c ON c.id = r.competitorId

このクエリによって、結果ごとに、基になるイベントと競合他社の名前を取得します。次に、PHP内でデータを管理して、必要なテーブルを作成する必要があります...しかし、それを実現するのは非常に難しいと思います...

できれば、競合他社とイベントを別々に選択してから、すべてのスコア結果を取得して、次のようなテーブルを作成することをお勧めします。

// we have $competitors array containing id => name
// we have $events array containing id => name
// we have $results array containing competitorId => [ eventId => score ]
echo '<table>';
echo '<tr><td>Competitors</td>';
foreach($events as $e)
    echo '<td>'.$e.'</td>';
echo '</tr>';
foreach($results as $cId => $val) {
    echo '<tr><td>'.$competitors[$cId].'</td>';
    foreach($events as $eId => $name) {
        echo '<td>'.$val[$eId].'</td>';
    }
    echo '</tr>';
}
echo '</table>';

しかし、これはただの迅速であまり良い解決策ではありません。1つのクエリの方法を使用したほうがよいでしょう。

于 2012-05-11T10:00:39.623 に答える
0

あなたは基本的にピボットテーブルを探しています。例があり、ここにあります。

于 2012-05-11T09:45:02.110 に答える
0

このようにphpでクエリを作成できます

<?php
$events = array('Assume this is array of events table with id,eventName as key');

$column = array();
foreach($events as $event)
{
     $column[] = 'SUM(IF(results.eventId = '.$event['id'].', results.eventScore, 0)) AS '.$event['eventName'];
}

$sql = 'SELECT   competitors.competitorName AS competitor,';
$sql .= implode(',',$column);
$sql .= ' FROM competitors';
$sql .= ' LEFT JOIN results ON results.competitorId = competitors.id';
$sql .= ' GROUP BY competitors.id';
//Put $sql into mysql_query then

次に、行を動的に取得します

while($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
    foreach($row as $k=>$v) 
    {
         //Here you get Column Name as $k  and data value as $v
    }
} 
于 2012-05-11T10:03:03.270 に答える