2017-05-17 10 views
0

複数のイベントが表示され、日付順に表示される必要があります。イベントは複数のテーブルに格納され、いくつかのクエリによって選択されます。 1つのテーブルに3〜4の列があり、もう1つの列に20の列があるため、union + order byを使用することはできません。私たちは、次の解決策が出ている複数の照会が作成された日付で作成されました

:そこにこのソリューションを

$stmt = $db->query(" 
    SELECT 'login' table, id, created 
    FROM login 
    WHERE date(created) BETWEEN 'somedate' AND 'somedate' 
    UNION 
    SELECT 'order' table, id, created 
    FROM order 
    WHERE date(created) BETWEEN 'somedate' AND 'somedate' 
    UNION 
    SELECT 'receipt' table, id, created 
    FROM receipts 
    WHERE date(created) BETWEEN 'somedate' AND 'somedate' 
    ORDER BY created 
"); 

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    $sorted[] = array(
     "table" => $row['table'], 
     "id" => $row['id'] 
    ); 
} 

foreach (array_chunk($sorted, 5000) as $dataChunk) { 
    foreach ($dataChunk as $row) { 
    if ($row['table'] == "login") { 
     $stmt = $db->query(" 
     SELECT some columns 
     FROM logins 
     WHERE id = ".$row['id']." 
     "); 
     $row_count = $stmt->rowCount(); 
     if ($row_count != '0') { 
     while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
      do something 
     } 
     } 
    } 
    if ($row['table'] == "order") { 
     $stmt = $db->query(" 
     SELECT some columns 
     FROM logins 
     WHERE id = ".$row['id']." 
     "); 
     $row_count = $stmt->rowCount(); 
     if ($row_count != '0') { 
     while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
      do a lot here 
     } 
     } 
    } 
    if ($row['table'] == "receipt") { 
     $stmt = $db->query(" 
     SELECT some columns 
     FROM logins 
     WHERE id = ".$row['id']." 
     "); 
     $row_count = $stmt->rowCount(); 
     if ($row_count != '0') { 
     while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
      do something 
     } 
     } 
    } 
    } 
} 

は、当社のデータベースへのクエリの数千人となりますので、私たちの質問です - これは、より良い方法で行うことができますか?

よろしくお願いします...ありがとうございました!

+0

'order'は、上記そんなに何か予約語は、かなりリング真実ではないんです。 – Strawberry

+0

ああ、それは単なる例です。私たちは実際に "ordre"を使用しています。これはノルウェーのオーダーです。上のコードはうまくいきますが、これを行うより良い方法だと思います。 – Virik

+1

あなたは、ユニオンを使用することができます、より少ない列を持つテーブルを参照するクエリでダミーの列を作成するだけです。もう1つの可能性は、共通列のグループを定義し、各問合せの列としてそれらを持つことです。次に、基本列以外のものについては、concatを使用して、その表に固有の列の名前/値の組を持つ単一の列を作成します。あなたはJSONとしてフォーマットして、それらを簡単に分解できるかもしれません。 –

答えて

0

**かっこを追加します。そうでなければ、ORDER BYSELECTに適用されます。

(SELECT ...) 
UNION ALL 
(SELECT ...) 
UNION ALL 
(SELECT ...) 
ORDER BY ... 

**明示的にDUPを期待する場合UNION DISTINCTを指定し、それらを取り除くしたい(おそらくあなたのコードに基づいていない)、または速度のためUNION ALL。スピードのために

**、あなたが持っている場合INDEX(created)

WHERE created >= 'start...' 
    AND created < 'end...' + INTERVAL 1 DAY` 
+0

カッコは効果がありませんが、UNION ALLに関するヒントをありがとうございます。 最後のコードを教えてください。 BETWEENを使用するよりも何が良いですか? – Virik

関連する問題