Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按创建日期排序的多个查询_Php_Mysql_Optimization - Fatal编程技术网

Php 按创建日期排序的多个查询

Php 按创建日期排序的多个查询,php,mysql,optimization,Php,Mysql,Optimization,我们需要按日期列出和订购几个活动。事件存储在多个表中,并由多个查询选择。我们不能使用union+order by,因为一个表可能有3-4列,而另一个表大约有20列 我们提出了以下解决方案: $stmt = $db->query(" SELECT 'login' table, id, created FROM login WHERE date(created) BETWEEN 'somedate' AND 'somedate' UNION SELECT 'order' t

我们需要按日期列出和订购几个活动。事件存储在多个表中,并由多个查询选择。我们不能使用union+order by,因为一个表可能有3-4列,而另一个表大约有20列

我们提出了以下解决方案:

$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
        }
      }
    }
  }
}
有了这个解决方案,我们的数据库将有数千个查询,所以我们的问题是——这能以更好的方式完成吗


希望收到你们的来信。。。谢谢大家!

**添加括号。否则,
ORDER BY
仅适用于
SELECT

( SELECT ... )
UNION ALL
( SELECT ... )
UNION ALL
( SELECT ... )
ORDER BY ...
**如果您希望DUP并希望消除它们(不可能基于您的代码),请明确指定
UNION DISTINCT
,或者
UNION ALL
以提高速度

**对于速度,如果您有
索引(已创建)

创建位置>='start…'
并创建了<'end…'+间隔1天`

order
是一个保留字,所以上面的内容听起来不太正确。哦,但这只是一个例子。我们实际上使用“ordre”,这是挪威语的order。虽然上面的代码工作得很好,但我认为这是更好的方法。您可以使用union,只需在引用表的查询中创建具有较少列的伪列。另一种可能是定义一组公共列,并将它们作为每个查询中的列,然后对于那些具有多个基本列的查询,使用concat为该表特有的列创建一个具有名称/值对的列。您甚至可以将其格式化为JSON,以便更轻松地分解它们。。虽然这有点混乱,但可能是一个更好的解决方案,因为只有一个查询?括号看起来没有任何效果,但感谢您提供有关UNIONALL的提示。你能解释一下你最后的密码吗。有什么比在两者之间使用更好的呢。
WHERE created >= 'start...'
  AND created  < 'end...' + INTERVAL 1 DAY`