php - SQL 查询中的自定义 ORDER BY 逻辑

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

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

我目前有一个页面列出条目按日期排序,分页限制。这是我的代码片段:

<?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“魔法”?

我希望以上是有道理的..

最佳答案

使用简单的 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

关于php - SQL 查询中的自定义 ORDER BY 逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8268690/

相关文章:

php - 在 for 循环中嵌套 json 对象

php - Zend_Form 获取错误

MySql DB 设计 - 两者中哪一个是最好的 - 规范化与否

php - MySQL 请求返​​回 null Controller PHP

java - Spring Data JPA 分页 - 从方法名称创建查询

php - 将自定义消息(或任何其他数据)传递给 Laravel 404.blade.php

php - 无法在 Highcharts 中的多列 mysql 数组上显示 x 轴标签

mysql - 同时将某一行的状态设置为“已批准”,并同时将其他行设置为“已拒绝”

elasticsearch - 使用多匹配查询进行分页

spring - 如何使用Freemarker和Spring进行分页?