如果db query A没有返回足够的结果,请运行查询B:如何优化?

ber*_*kes 5 php mysql refactoring

我正在寻找一个好的设计模式,或最佳实践,以实现"此查询,或其他查询"的情况,具有最佳性能和最小开销.

demans的商业逻辑/程序说"自Foo之后的所有项目",除非返回少于三个项目,然后是"所有项目".我正在重构当前的代码,并且无法想出实现这种逻辑的好方法.

当前的伪代码(Drupal/PHP):

<?php
$result = db_query(
'SELECT n.uid FROM og_ancestry oga ' .
'INNER JOIN node n on n.nid = oga.nid ' .
'WHERE oga.group_nid = %d AND n.created > %d GROUP BY n.uid ' .
'ORDER BY cnt DESC LIMIT %d', $group_nid, $since, $limit);


while ($row = db_fetch_array($result)) {
  $uids[] = $row['uid'];
}

if (count($uids) < 3) {
  $result = db_query(
    'SELECT n.uid FROM og_ancestry oga ' .
    'INNER JOIN node n on n.nid = oga.nid ' .
    'WHERE oga.group_nid = %d GROUP BY n.uid ' .
    'ORDER BY cnt DESC LIMIT %d', $group_nid, $limit);

  while ($row = db_fetch_array($result)) {
    $uids[] = $row['uid'];
  }
}
//...do something with the result.
?>
Run Code Online (Sandbox Code Playgroud)

这段代码感觉"不对",首先是因为DRY:它包含相同的查询,只有一个小的区别.我可以通过更聪明的查询构建来改变它.

但更糟糕的是,我需要锤击数据库(查询非常繁重)只是为了发现在超过一半的情况下,我需要丢弃结果并再次查询数据库.

你会如何处理这种情况?

Car*_*ter 4

如果,正如您所说,“在超过一半的情况下,我需要丢弃结果并再次查询数据库”,那么您最好的选择可能是运行第二个查询,然后在本地评估结果数据集,丢弃记录(如果适用)。实际上,这更多的是一种转移复杂性的问题,而不是降低复杂性的问题,但至少只有一次数据库访问。

如果是ORDER BY n.created DESC,过滤可以简单地查看第三条记录,如果它早于 foo,则完成;否则,您需要找到 foo 之前的第一条记录并丢弃它和后续记录。