排序选定的数据
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 或其他东西。
我正在做一个图书馆项目。我想按以下顺序显示 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 或其他东西。