Mysql 根据另一列中的值按列1或列2对行进行排序
假设我有两张桌子: 课程Mysql 根据另一列中的值按列1或列2对行进行排序,mysql,sql,sorting,sql-order-by,Mysql,Sql,Sorting,Sql Order By,假设我有两张桌子: 课程 | id | name | is_sort_by_borrower | |----|--------------|---------------------| | 1 | Comp Science | 1 | | 2 | Biz Admin | 0 | | 3 | Physics | 1 | | id | title |
| id | name | is_sort_by_borrower |
|----|--------------|---------------------|
| 1 | Comp Science | 1 |
| 2 | Biz Admin | 0 |
| 3 | Physics | 1 |
| id | title | borrower | last_borrow_date | course_id |
| --- | ------ | -------- | ---------------- | --------- |
| 1 | Book A | 523 | 11/12/19 12:33 | 1 |
| 2 | Book B | 423 | 11/15/19 12:33 | 1 |
| 3 | Book C | 401 | 10/22/19 12:33 | 1 |
书籍
| id | name | is_sort_by_borrower |
|----|--------------|---------------------|
| 1 | Comp Science | 1 |
| 2 | Biz Admin | 0 |
| 3 | Physics | 1 |
| id | title | borrower | last_borrow_date | course_id |
| --- | ------ | -------- | ---------------- | --------- |
| 1 | Book A | 523 | 11/12/19 12:33 | 1 |
| 2 | Book B | 423 | 11/15/19 12:33 | 1 |
| 3 | Book C | 401 | 10/22/19 12:33 | 1 |
在课程中有一列是按借款人排序的,我想得到这样的结果
| course | book_title | borrower | last_borrow_date | is_sort_by_borrower |
|--------------|------------|----------|------------------|---------------------|
| Comp Science | Book A | 523 | 11/12/19 12:33 | 1 |
| Comp Science | Book B | 423 | 11/15/19 12:33 | 1 |
| Comp Science | Book C | 401 | 10/22/19 12:33 | 1 |
| Comp Science | Book D | 377 | 11/19/19 12:33 | 1 |
| Biz Admin | Book E | 122 | 11/20/19 12:33 | 0 |
| Biz Admin | Book F | 419 | 11/12/19 12:33 | 0 |
| Biz Admin | Book G | 65 | 10/18/19 12:33 | 0 |
| Physics | Book H | 446 | 8/31/19 12:33 | 1 |
| Physics | Book I | 398 | 11/2/19 12:33 | 1 |
| Physics | Book J | 376 | 9/30/19 12:33 | 1 |
| Physics | Book K | 249 | 10/11/19 12:33 | 1 |
是否可以按借用者
对结果进行排序,有些按上次借用日期
对结果进行排序?是的,在“选择并使用”用例中创建另一列以填充所需的值,然后按该值进行排序。您还可以在WHERE子句中使用CASE语句,具体取决于您是否希望排序列显示结果
参考:
参考:
在您的示例中:
SELECT
c.id, c.name, c.is_sort_by_borrower,
b.id, b.title, b.borrower, b.last_borrow_date
FROM
courses c
INNER JOIN
books b on b.course_id = c.id
ORDER BY
CASE
WHEN is_sort_by_borrower=1 THEN borrower
WHEN is_sort_by_borrower=0 THEN last_borrow_date
END ASC
是的,在选择和用例中创建另一列,用您想要的值填充它,然后按该值排序。您还可以在WHERE子句中使用CASE语句,具体取决于您是否希望排序列显示结果
参考:
参考:
在您的示例中:
SELECT
c.id, c.name, c.is_sort_by_borrower,
b.id, b.title, b.borrower, b.last_borrow_date
FROM
courses c
INNER JOIN
books b on b.course_id = c.id
ORDER BY
CASE
WHEN is_sort_by_borrower=1 THEN borrower
WHEN is_sort_by_borrower=0 THEN last_borrow_date
END ASC
ORDER BY
需要如下所示:
ORDER BY course -- courses grouped together
, CASE WHEN is_sort_by_borrower = 1 THEN borrower END DESC
, CASE WHEN is_sort_by_borrower = 0 THEN last_borrow_date END DESC
根据排序标志,给定课程的两列中正好有一列为空。不能在同一列中组合这两种数据类型,否则结果将不可预测。排序依据需要如下所示:
ORDER BY course -- courses grouped together
, CASE WHEN is_sort_by_borrower = 1 THEN borrower END DESC
, CASE WHEN is_sort_by_borrower = 0 THEN last_borrow_date END DESC
根据排序标志,给定课程的两列中正好有一列为空。您不能在同一列中组合这两种数据类型,否则结果将无法预测。谢谢。它起作用了。如果我希望borrower
是DESC,而last\u borrow\u date
是ASC,该怎么办?例如,当您在一列中混合数据类型时,MySQL可能会将所有以11/
开头的日期视为相等。我还没有测试过这个,谢谢。它起作用了。如果我希望borrower
是DESC,而last\u borrow\u date
是ASC,该怎么办?例如,当您在一列中混合数据类型时,MySQL可能会将所有以11/
开头的日期视为相等。但我还没有测试过这个。