2

1 つの出力で 3 つの異なるログ テーブルの検索結果を作成しようとしています。この出力は「時間」でソートし、foreach ループでエコーする必要があります。

  1. テーブル

    ID | レコード ID | ユーザー ID | 時間 | セクター | 情報

  2. テーブル

    ID | ユーザー ID | ip | 時間 | パス | 情報 | メッセージ | レベル

  3. テーブル

    ID | req_id | ユーザー | 時間 | 情報 | タイプ | IP

3 つの結果はすべて異なり、ほとんど比較できません...

問題は、結果をどこでどのようにマージするかです...これを1つのクエリだけで処理できるとは思いませんか? JOIN (参照がない) と UNION (列の数が異なる) の選択が間違っている可能性がありますか?

他に選択肢がない場合は、3 つのクエリを作成し、結果の配列をそのようにマージできます

function cmp($a, $b) {
  if ($a['time'] == $b['time']) {
    return 0;
  }

  return ($a['time'] < $b['time']) ? -1 : 1;
}

$new_arr = array_merge($result1, $result2, $result3);
uasort($new_arr, 'cmp'); 
4

2 に答える 2

1

不均衡な列の結果を「伸ばす」限り、ユニオンを使用できます。

SELECT 'table1' AS source, record_id, user_id, time, sector, path
UNION ALL
SELECT 'table2', user_id, null, null, ip, etc....
UNION ALL
SELECT 'table3', null, req_id, null, null, ip, etc...

基本的に、3 つのテーブル間で共通のフィールド、または少なくとも型の互換性があるフィールドについては、そのフィールドの結果で特定の列を使用できます。1 つのテーブル内の一致しない/型に互換性のないフィールドについてNULL は、他のクエリで「一致する」値として選択するだけです。

ただし、これによりクライアント側のロジックがはるかに複雑になるため、弾丸をかじって 3 つの異なるクエリを実行する方がよいでしょう。ある時点で、単一の結合されたクエリを起動することによるわずかな効率の向上よりも、関連するデータを再度分離するためにクライアントで実行する必要がある追加の処理が優先されます。

于 2013-07-01T04:09:48.410 に答える
1

可能な解決策は、結果セットを固定数の列 (以下の例では 5)UNION ALLCONCAT_WS()統合することです。そしてexplode() details、結果セットを反復処理しながら、php の列の値を取得します。

SELECT 1 source, id, record_id id2, time, CONCAT_WS('|', user_id, sector, info) details
  FROM table1
 UNION ALL
SELECT 2, id, user_id, time, CONCAT_WS('|', ip, path, info, message, level)
  FROM table2
 UNION ALL
SELECT 3, id, req_id, time, CONCAT_WS('|', user, info, type, ip)
  FROM table3
 ORDER BY time DESC, source, id, id2

出力例:

| | ソース | ID | ID2 | 時間 | 詳細 |
-------------------------------------------------- -------------------------------------------------- ---------------
| | 1 | 11 | 111 | 2013-06-30 16:00:00 | 12|セクター1|情報の詳細|
| | 2 | 12 | 13 | 2013-06-30 15:00:00 | 10.10.10.1|/your/path/some/where|情報の詳細|メッセージの詳細|レベル1 |
| | 3 | 13 | 1024 | 2013-06-30 12:00:00 | user1|情報詳細|タイプ情報|10.10.10.2 |

ここにSQLFiddle dmeoがあります

于 2013-07-01T04:14:58.790 に答える