【问题标题】:select returns zero rows although it should return some entries尽管它应该返回一些条目,但选择返回零行
【发布时间】:2019-03-17 08:20:18
【问题描述】:

我有一个代表简单演示论坛的 postgres 数据库。有两个表叫

主题

id   | topic_id (the parent topic) | name | description
-------------------------------------------------------
uuid | uuid                        | text | text

线程

id   | topic_id | name | created_at
-------------------------------------------------------
uuid | uuid     | text | timestamp without timezone

通过使用 Express REST API,我想获取一个主题的所有信息。我传入它的 ID 并希望得到这样的结果

{
    parentTopic: {}, // could be null if no parent is available
    name: "",
    description: "",
    childTopics: [{}, {}, {}],
    threads: [{}, {}, {}] // should be sorted by created_at
}

据我所知,不可能返回这样的结果。但是我尝试创建一个查询来获取这些信息,也许我可以稍后用一些代码来映射它。

SELECT
    currentTopic.name,
    currentTopic.description,
    parentTopic.id AS parentTopicId,
    parentTopic.name AS parentTopicName,
    parentTopic.description AS parentTopicDescription,
    childTopic.id AS childTopicId,
    childTopic.name AS childTopicName,
    childTopic.description AS childTopicDescription,
    linkedThread.id AS threadId,
    linkedThread.name AS threadName,
    linkedThread.created_at AS threadCreatedAt
FROM
    topic currentTopic
INNER JOIN
    topic parentTopic ON currentTopic.topic_id = parentTopic.id
INNER JOIN
    topic childTopic ON currentTopic.id = childTopic.topic_id
INNER JOIN
    thread linkedThread ON currentTopic.id = linkedThread.topic_id
WHERE
    currentTopic.id = '624aaab6-2d2d-45dc-a425-c2863f05779c'
ORDER BY
    linkedThread.created_at;

执行此操作时(我使用 pgAdmin)我没有发生错误,但我得到 0 行返回。我确定,应该有一些条目要检索。

那个查询有问题吗?有没有办法改进查询以返回可以使用的结果(我上面提到的 JS 对象)?

编辑:

这是线程和主题的一些测试数据

主题表:

线程表:

【问题讨论】:

  • 分享您的表格数据,否则我们怎么知道它为什么不返回行
  • parentTopic 的注释“如果没有可用的父级,则可能为空”不准确 - 查询具有内部连接,因此没有父级将没有结果。
  • 我更新了我的问题以提供表格中的一些数据
  • @Question3r 尝试使用topicwhere 子句输出行。然后,逐个inner join看是哪一个过滤掉了行
  • @Koen 所以你认为一次查询是不可能的?

标签: javascript sql postgresql rest express


【解决方案1】:

将内连接改为左连接

SELECT
    currentTopic.name,
    currentTopic.description,
    parentTopic.id AS parentTopicId,
    parentTopic.name AS parentTopicName,
    parentTopic.description AS parentTopicDescription,
    childTopic.id AS childTopicId,
    childTopic.name AS childTopicName,
    childTopic.description AS childTopicDescription,
    linkedThread.id AS threadId,
    linkedThread.name AS threadName,
    linkedThread.created_at AS threadCreatedAt
FROM
    topic currentTopic
left JOIN
    topic parentTopic ON currentTopic.topic_id = parentTopic.id
left JOIN
    topic childTopic ON currentTopic.id = childTopic.topic_id
left JOIN
    thread linkedThread ON currentTopic.id = linkedThread.topic_id
WHERE
    currentTopic.id = '624aaab6-2d2d-45dc-a425-c2863f05779c'
ORDER BY
    linkedThread.created_at;

【讨论】:

  • 谢谢,我认为这行得通。有没有办法以更接近所需 javascript 对象格式的方式更改结果?我认为GROUP BY 会这样做,但我以前从未使用过它
  • @Question3r 如果您不需要聚合,则不需要分组,所以这取决于您的要求
猜你喜欢
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2021-02-25
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
相关资源
最近更新 更多