【问题标题】:Change ID values in the result set of a mysql join更改 mysql 连接结果集中的 ID 值
【发布时间】:2020-03-04 20:45:42
【问题描述】:

我有 2 张桌子、书籍和流派订单。我正在尝试从书籍(t1)中选择所有值,并使用 JOIN 使用来自genre_order(t2)的 order 列按流派对它们进行排序。结果集对它们进行了很好的排序,但是,我对如何更改 book_id 以反映新顺序一无所知。

table : books
+-------+------------------+-----------+
|book_id|   name           |   genre   |
+-------+------------------+-----------+
|   1   |   Harry Potter   |  Fantasy  |
|   2   |   The Alchemist  |  Fantasy  |
|   3   |   Inferno        |  Thriller |
|   4   |   Steve Jobs     |  Biography|
|   5   |   John Adams     |  Biography|
+-------+------------------+-----------+


table : genre_order
+-----------+-------+
|   genre   | order |
+-----------+-------+
| Biography |  1    |
| Fantasy   |  2    |
| Thriller  |  3    |
+-----------+-------+ 

查询:

SELECT * FROM books t1 JOIN genre_order t2 ON t1.genre = t2.genre ORDER BY t2.order ASC 

结果:

  +-------+------------------+-----------+-----------+------+
  |book_id|   name           |   genre   |  genre    | order|
  +-------+------------------+-----------+-----------+------+
  |   4   |   Steve Jobs     |  Biography|  Biography|  1   |
  |   5   |   John Adams     |  Biography|  Biography|  1   |
  |   1   |   Harry Potter   |  Fantasy  |  Fantasy  |  2   |
  |   2   |   The Alchemist  |  Fantasy  |  Fantasy  |  2   |
  |   3   |   Inferno        |  Thriller |  Thriller |  3   |
  +-------+------------------+-----------+-----------+------+

预期结果:

  +-------+------------------+-----------+------+
  |book_id|   name           |   genre   | order|
  +-------+------------------+-----------+------+
  |   1   |   Steve Jobs     |  Biography|  1   |
  |   2   |   John Adams     |  Biography|  1   |
  |   3   |   Harry Potter   |  Fantasy  |  2   |
  |   4   |   The Alchemist  |  Fantasy  |  2   |
  |   5   |   Inferno        |  Thriller |  3   |
  +-------+------------------+-----------+------+

是否可以更改结果集中的 book_id?另外,如何避免冗余列?

【问题讨论】:

  • 你能添加一个模式(你想要什么)吗?
  • '另外,如何避免冗余列?'指定列名而不是 *。 '是否可以更改结果集中的 book_id' - 是的,但我不清楚你想要 1,2,3,4,5 还是 1,2,1,2,1
  • @Tushar 我编辑显示预期结果
  • @P.Salmon 我没想到,谢谢。
  • @JonZee 我添加了一个答案,希望第二个查询能够成功。

标签: mysql database join


【解决方案1】:

试试这个代码

SELECT ROW_NUMBER() over (order by pk_field ) as book_id,t1.name,t2.genre,t2.order FROM books t1 JOIN genre_order t2 ON t1.genre = t2.genre ORDER BY t2.order ASC 

或者这个代码

select  @ab:=@ab+1 as book_id,a.* from (SELECT t1.name,t2.genre,t2.order FROM books t1 JOIN genre_order t2 ON t1.genre = t2.genre ORDER BY t2.order DESC) a, (SELECT @ab:= 0) AS ab 

【讨论】:

  • 第二个查询在去除冗余列而不是 id 顺序方面起作用
  • 好的。现在试试。希望它现在可以工作。我根据您的回复更改了它。
  • 现在可以使用了,谢谢。另外,如果可以的话,请分享一个链接,让我可以阅读更多相关信息以了解其背后的逻辑。
  • w3schools.com/sql/default.asp 阅读这里并不断练习。祝你好运
  • 请在您的答案中添加一些解释,以便其他人学习
【解决方案2】:

使用变量作为表,并与源表交叉连接:

SELECT @row_number:=@row_number+1 AS book_id, t1.* 
FROM books t1, (SELECT @row_number:=0) AS t 
JOIN genre_order t2 ON t1.genre = t2.genre 
ORDER BY t2.order ASC

【讨论】:

  • 请在您的答案中添加一些解释,以便其他人学习
猜你喜欢
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 2013-10-31
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多