排序选定的数据

Ordering selected data

我正在做一个图书馆项目。我想按以下顺序显示 return 读过书的人:15 天没有 return 读过书的人,然后 return 没有读过书的人] 编辑了他们的书,但仍然有时间到 15 天的时间限制和 return 编辑了他们的书的人。 table 看起来像这样:

id | pupil  | professor | date_of_taking      | expected_date       | returned | book |
---------------------------------------------------------------------------------------
1  |1       |1          | 2016-01-16 00:00:00 | 2016-01-30 00:00:00 | 0        | 20   |
2  |2       |1          | 2016-01-07 00:00:00 | 2016-01-14 00:00:00 | 0        | 93   |
3  |1       |1          | 2016-01-09 00:00:00 | 2016-01-30 00:00:00 | 1        | 14   |

学生一栏是拿书人的id。 professor 列包含赠书者的 ID。 book 列包含被拿走的书的 id。所有这些数据都在另外 table 秒内。取书日期是此人取书的日期,预期日期是此人应该 return 取回书的日期。

所以如果你不理解前面的解释,我真正想要的是: 首先显示 id 2 因为时间限制已过,他应该 return 这本书。之后,显示 1 因为他还没有 return 阅读这本书,但还有更多时间。最后,显示 3 因为他已经 return 编辑了这本书。现在想象一下 table 中有数千行。如何命令它按照我在此处解释的顺序显示数据。

这是我的资料。我只是需要有关订购数据的帮助。

SELECT 
    A.date_of_taking,
    A.expected_at,
    A.returned,
    B.name as pupil,
    C.name as prof,
    D.author,
    D.title
FROM taken AS A
INNER JOIN pupils AS B ON A.pupil = B.id
INNER JOIN users AS C ON A.professor = C.id
INNER JOIN books AS D ON A.book = D.id
LIMIT 50

顺便说一下,table 中两个日期之间的差异严格来说并不是 15 天,因为这只是一个 table 用于测试。
这也是 PHP 中的代码,但我想将这 3 个查询合并为一个。如果可以的话。

$stmt = $this->db()->query("SELECT 
        A.date_of_taking,
        A.expected_at,
        A.returned,
        B.name as pupil,
        C.name as prof,
        D.autor,
        D.title

        FROM taken AS A
        INNER JOIN pupils AS B ON A.pupil = B.id
        INNER JOIN users AS C ON A.professor = C.id
        INNER JOIN books AS D ON A.book = D.id
        WHERE A.returned='0' AND A.date_of_taking < A.expected_at ORDER BY A.date_of_taking ASC");

$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt = $this->db()->query("SELECT 
        A.date_of_taking,
        A.expected_at,
        A.returned,
        B.name as pupil,
        C.name as prof,
        D.autor,
        D.title

        FROM taken AS A
        INNER JOIN pupils AS B ON A.pupil = B.id
        INNER JOIN users AS C ON A.professor = C.id
        INNER JOIN books AS D ON A.book = D.id
        WHERE A.date_of_taking > A.expected_at ORDER BY A.date_of_taking ASC");

$var = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($var as $value) {
    $result[] = $value;
}
$stmt = $this->db()->query("SELECT 
        A.date_of_taking,
        A.expected_at,
        A.returned,
        B.name as pupil,
        C.name as prof,
        D.autor,
        D.title

        FROM taken AS A
        INNER JOIN pupils AS B ON A.pupil = B.id
        INNER JOIN users AS C ON A.professor = C.id
        INNER JOIN books AS D ON A.book = D.id
        WHERE A.returned='1' ORDER BY A.date_of_taking ASC");

$var = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($var as $value) {
    $result[] = $value;
}
return $result;

如果您指定

ORDER BY RETURNED, EXPECTED_DATE

然后全部返回 = 0 在返回之前 = 1 并且在该订单中 expected_date 未来更多的订单将在该订单中订购。

我是不是漏掉了什么,或者您需要的只是:

SELECT 
    A.date_of_taking,
    A.expected_at,
    A.returned,
    B.name as pupil,
    C.name as prof,
    D.author,
    D.title
FROM taken AS A
INNER JOIN pupils AS B ON A.pupil = B.id
INNER JOIN users AS C ON A.professor = C.id
INNER JOIN books AS D ON A.book = D.id
ORDER BY ( CURRENT_DATE -  A.date_of_taking ) DESC  
LIMIT 50

注1不同的数据库可能有不同的日期运算规则。因此,您可能需要使用另一个 database-depending 函数更改 ( DATE2 - DATE1 ) return 计算两个日期之间的天数(例如 DATEDIFF())

Note2 一些数据库使用 CURRENT_DATE 到 return... 当前日期。在其他情况下,这可能是 SYSDATE 或其他东西。