【问题标题】:Postgres order by changePostgres 按更改排序
【发布时间】:2020-06-25 03:58:04
【问题描述】:

我正在尝试按我的 Postgres 问题数据库中的 ID 更改顺序。

由于某种原因随机排序,但我希望它按 ID ASC 排序。

我对 postgres 很陌生,所以我不知道自己在做什么..,

我只想要这个查询的结果:

SELECT * 
FROM public.questions
ORDER BY id ASC

但我不知道如何使用显示查询输出的顺序更新我的数据库。它不会让我保存它,我知道我做错了什么。 如何实现?

这是当前顺序,id 依次为 1,2 然后 4

我希望它按照 id 1,2,3,4 的完美顺序看起来像这样

我之所以要这样做是因为我希望容器中的问题按 ID 顺序显示,这里是我的代码,有什么想法可以实现吗?

class QuestionContainer extends React.Component {
  constructor() {
    super();
    this.state = {
      questions: [],
    };
    this.SubmitQuestion = this.SubmitQuestion.bind(this);
  }

  componentDidMount() {
    axios.get(`${env.url}/api/v1/en/questions?limit=100`).then((res) => {
      const qes = res.data.questions.map((a) => ({
        questionId: a.question_no,
        question: a.question,
      }));
      this.setState({ questions: qes });
    }, (err) => {
      console.log('Question fetch error ', err);
      this.setState({
        questions: [{
          questionId: 1,
          question: 'All',
        }],
      });
    });
  }

【问题讨论】:

  • 我很难回答这个问题。您能否发布同一张表以及您希望查询结果的样子;之前/之后的视图。
  • @Mike 当然我已经用图片更新了我的问题,为我糟糕的英语道歉
  • 但是 id 3 不见了...
  • 好吧,我的自动完成功能启动了。应该说“样本”不“相同”:)

标签: javascript sql reactjs postgresql axios


【解决方案1】:

有几点:

  1. 检索元组时,不能保证它们将以一致的方式排序。为了速度,它们被编译成一个集合,可能是随机顺序。强制排序的方法是使用ORDER BY 子句。没有它,就无法保证
  2. 我建议不要使用id(主键)作为有序列。如果顺序很重要,我会在表中添加一个order 列,或者我更喜欢有一个时间戳字段。不过,在您的情况下,question_no 似乎具有语义顺序,所以我可能会在 id 上使用它。
  3. 您的示例看起来像是在使用 JavaScript React;您可以从数据库中获取订单,也可以在演示逻辑中更新订单。下面我使用了.sort((a,b)=>a.questionId - b.questionId),这是一个简单的例子:

    const qes = res.data.questions.map((a) => ({
      questionId: a.question_no,
      question: a.question,
    })).sort((a,b)=>a.questionId - b.questionId);
    
  4. 如果您想尝试在没有排序的情况下检索它,我认为您可以将参数传递给 axios API。所以这一行:

    axios.get(`${env.url}/api/v1/en/questions?limit=100`)
    

    将改为:

    axios.get(`${env.url}/api/v1/en/questions?orderBy=\"question_no\"&limit=100`)
    

【讨论】:

  • res.data.questions.map((a) => ({ questionId: a.question_no, question: a.question, })).sort((a,b)=>a.question_no-b.question_no);
  • @Ben 看起来你只是复制了我输入的内容(或者我看不出有什么不同),但这确实帮助我看到他将question_no 重命名为questionId。答案已更新
  • 谢谢你真的很感激,我想我只是想从这里得到订单,但我仍然不知道我该怎么做。我设法做到了但我正在努力解决如何像你一样按 question_no 或 id 对其进行排序,这正是我需要做的。
  • 我不清楚你在问什么。您可能可以完全放弃 sort(),更新 axios 调用,它应该在数据库查询中调用 ORDER BY。也就是说,a 和b 只是指向数组的两个元素(当前值和下一个值)以进行比较的变量。它评估一个大于另一个,并根据返回值是正数、负数还是零来更改元素的顺序。
  • 一切都很好,我以为我做错了什么,但根据您提供的建议,最终解决了问题。你让我的头痛大大减轻了。谢谢!
【解决方案2】:

如果您希望结果按特定顺序排列,您总是必须添加ORDER BY。

表有一个物理顺序,但在 PostgreSQL 中,每当您修改数据时,它都会发生变化,即使您不修改数据,也不能保证按特定顺序获得结果。

【讨论】:

  • 谢谢我这样做的原因是因为我希望我的问题容器中出现的问题按 ID 排序..,有没有想过我将如何实现它?我用代码更新了我的问题..
  • 只需在 SQL 语句中添加一个ORDER BY。我不知道你必须用你的 ORM(你没有标记)做什么才能得到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
相关资源
最近更新 更多