-1

私が持っているテーブルをクエリし、select ステートメントで特定の出力形式を生成する方法をワークアウトしようとしています。ソーステーブルのデータは次のとおりです。

+-----------+------------------------+
| prefix_id | Description  | A  | B  |
+-----------+------------------------+
|     55207 | TEST 1       | 1  | 0  |
|     55363 | Test 2       | 1  | 0  |
|     55378 | Test 3       | 0  | 1  |
|     55379 | Test 4       | 1  | 1  |
+-----------+------------------------+

上記のデータに対して私が望む出力は次のとおりです

+-----------+------------+
| A         | B          |
+-----------+------------|
| TEST 1    | Test 3     |
| Test 2    | Test 4     |
| Test 4    | NULL       |
+-----------+------------+

ご覧のとおり、テスト 4 の説明は列 A と B に当てはまるため 2 回表示されますが、順序は重要ではありません。NULL 文字は、列 A または B の末尾にのみ表示する必要があります。各エントリが対応する列の下に 1 回表示される限り、ID は重要ではありません。

一時テーブルが役立つかもしれませんが、その方法がわかりません。列 A または B の個別のクエリは簡単ですが、それらを出力にマージするのが私の問題です。

出力が Excel で表示されるものであると想像してください。列の上部にあるデータの下部に空白を入力する必要があります。

あなたの助けに感謝します。

ノート。SQLクエリでこれを達成しようとしています。クエリ出力は、Analytics レポート ツールである myDBR と呼ばれるものを使用してレンダリングされます。

4

2 に答える 2

1

これは SQL で行うことができます。あなたがしようとしているのは、2 つのリストを並べることです。幸いなことに、順序は気にしません (順序を指定する列がないため)。

次の例では、データを "A" 列用と "B" 列用の 2 つの部分に分割しています。次に、MySQL のトリックを使用して連番を計算します (他のデータベースではこれを使用row_number()します)。

クエリは次のとおりです。

select MAX(A), MAX(B)
from ((select @rn1 := @rn1 + 1 as rn, Description as A, NULL as B
       from t cross join (select @rn1 := 0) const
       where A = 1
      ) union all
      (select @rn2 := @rn2 + 1 as rn, NULL as A, Description as B
       from t cross join (select @rn2 := 0) const
       where B = 1
      )
     ) t
group by rn
于 2013-05-02T18:33:47.703 に答える
0

単純なデータベース クエリですべての結果を取得できます。それらをループして、列 A、B、またはその両方に属しているかどうかを判断します。

<?php
// Query all entries from database
$rs = mysql_query('SELECT Description, A, B FROM table ORDER BY Description ASC');

// Loop through all rows in result set
while ( $row = mysql_fetch_assoc( $rs ) ){
    // if Column A = 1, add to $colA array
    if ( $row['A'] > 0 ) $colA[] = $row;
    // if Column B = 1, add to $colB array
    if ( $row['B'] > 0 ) $colB[] = $row;
}

次に、データを使用して何かを行う必要があります。HTML形式で表示するか、CSV形式にダンプするか、または他の何かにダンプするかどうか、質問からはわかりません。

しかし、A=1 に一致する行を含む配列 $colA と、B=1 に一致する行を含む配列 $colB ができました。

HTML で出力する方法は次のとおりです。

<?php

// Setup the base table
$table_html = '<table><tr><th>A</th><th>B</th></tr>';
$x=0;


// Determine which array has more children
if ( count( $colA ) >= count( $colB ) ) {
    $use = 'colA'; // A has more
    $counter = 'colB';
} else {
    $use = 'colB'; // B has more
    $counter = 'colA';
}

// The variable variable lets us use either $colA or $colB, as determined by the value in $use.
// More info here: http://php.net/manual/en/language.variables.variable.php
foreach ( $$use as $row ){
    // Append the current row, and if its counterpart exists, the other row

    if ( $use == 'colA' ){
        $table_html .= '<tr><td>' . $row['Description'] . '</td><td>' . ( isset( ${$counter}[ $x ] ) ? ${$counter}[ $x ]['Description'] : '' ) . '</td></tr>';
    } else {
        $table_html .= '<tr><td>' . ( isset( ${$counter}[ $x ] ) ? ${$counter}[ $x ]['Description'] : '' ) . '</td><td>' . $row['Description'] . '</td></tr>';
    }
    $x++; // Increment the counter
}

// Close the table
$table_html .= '</table>';

// Output to browser
echo $table_html;
于 2013-05-02T16:57:16.013 に答える