【问题标题】:Custom ORDER BY logic in an SQL querySQL 查询中的自定义 ORDER BY 逻辑
【发布时间】:2012-01-06 07:25:27
【问题描述】:

我正在寻找以下问题的优雅解决方案:

我目前有一个页面列出了按日期排序的条目,并带有分页限制。这是我的代码的 sn-p:

<?php
$intPageNumber = 1;
if ( isset($this->GET['p']) && (integer)$this->GET['p'] > 1 ) $intPageNumber = (integer)$this->GET['p'];
$strLimit = " LIMIT " . (($intPageNumber-1)*$intItemsPerPage) . ", " . $intItemsPerPage;

$sql = "SELECT SQL_CALC_FOUND_ROWS * FROM jos_h_testimonials ORDER BY date DESC ".$strLimit;
// code to load some records here
// ...

// take care of pagination
$db->setQuery('SELECT FOUND_ROWS()');
$intTotalRecords = $db->LoadResult();
$this->NumberOfPages = ceil( $intTotalRecords / $intItemsPerPage);
$this->CurrentPage = $intPageNumber;
?>

表架构:

CREATE TABLE IF NOT EXISTS `jos_h_testimonials` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `author` varchar(255) NOT NULL,
  `testimonial` text NOT NULL,
  `rating` int(11) NOT NULL,
  `date` int(11) NOT NULL,
  `hgroup_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

这是一种以分页方式处理列表条目的标准方法。 我的问题是客户想要特殊排序 - 他们希望具有特定值的条目 hgroup_id 外键出现在顶部。

我能想到的两个解决方案是:

  1. 加载整个列表并使用 PHP 重新排序,然后使用 PHP 处理分页;
  2. 运行两个查询 - 一个选择具有所需外键的条目,第二个选择所有其他整体。合并结果集并.. 使用 PHP 处理分页。

无论哪种方式,我优雅的单查询 SQL_CALC_FOUND_ROWS 分页方法都行不通。我很好奇我是否可以在 ORDER_BY 子句中使用一些 MySQL“魔法”?

我希望以上内容有意义..

【问题讨论】:

  • 描述不完整。表架构是什么(如CREATE TABLE 语句)?应该首先出现的行的确切条件是什么(如果您不确定 SQL,请使用英语)?
  • 正如 outis 所说,从您的描述中不清楚为什么您不能在查询中仅按此外键排序以将它们放在首位。
  • @Cylindric 我不能 ORDER BY hgroup_id 的原因是因为它不是 ASC 也不是 DESC 排序 - 我可能需要在顶部显示所有带有 hgroup_id = 9 的记录,然后是其余的以下按日期排序的记录。
  • 请将表格架构放入您的问题中,这样每个人都可以在不查看 cmets 的情况下看到它。

标签: php mysql pagination sql-order-by sql-calc-found-rows


【解决方案1】:

它不是很优雅,但是你可以使用UNION 来组合两个子选择的结果,这意味着 MySQL 仍然会处理分页。但是,它的性能不会很好,因为 MySQL 仍然需要获取每个结果的全部内容。

【讨论】:

    【解决方案2】:

    使用简单的 SQL:

    SELECT SQL_CALC_FOUND_ROWS *
    FROM jos_h_testimonials
    ORDER BY
        -- Special case on top
        CASE WHEN hgroup_id = 9 THEN 0
        -- All the rest
        ELSE 1 END ASC,
        -- Regular sort order
        date DESC
    

    【讨论】:

    • 谢谢@ZombieHunter - 我怀疑这样的事情是可能的。我很感激我不必写可憎的东西
    • 为什么不只是“ORDER BY hgroup_id = 9 DESC”?
    猜你喜欢
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多