【问题标题】:Query with two joins and two tables使用两个连接和两个表进行查询
【发布时间】:2022-01-15 08:53:39
【问题描述】:

为了简化问题,假设我有 2 个表: 用户

  • id: int

门票

  • id: int
  • user_id: int
  • 标记:bool

使用给定的示例数据:

用户

id
1
2
3
4
5

门票

id user_id marked
1 1 false
2 1 true
3 1 true
4 2 true
5 2 false
6 2 false
7 3 false
8 5 false
9 5 false

用户 1 和 2 已标记工单。 用户 3 有 1 张未标记的工单。 用户 4 没有票。 用户 5 有 2 张未标记的票证。

我需要一个返回 tickets 的查询,其中 id 7、8 和 9 - 没有标记票证的用户的票证。

我编写了以下查询:

SELECT * FROM ticket t
INNER JOIN user u ON t.user_id=u.id
INNER JOIN ticket tt ON u.id = tt.user_id
WHERE tt.marked = false;

但它没有按预期工作。我不想使用子查询来排除带有标记票证的用户。这可以通过 JOIN 完全完成吗?所以碰巧我对 JOIN 子句不太熟悉。

【问题讨论】:

  • 您能否更具体地了解“但它没有按预期工作”?它做什么,什么不做什么?
  • 为什么不想使用子查询?
  • 您还想返回 id=7,8,9 因为它们没有标记。但门票 5 和 6 也没有标记。为什么你不想返回 5 和 6 ?
  • 什么 rdbms?我的没有 bool 数据类型。
  • 您还应该指定预期结果。

标签: sql join


【解决方案1】:

这假设markedint。您可能需要调整查询以转换您的 bool 数据类型。

with a as (
    select t.user_id
    , max(t.marked) as marked
    from ticket t
    group by t.user_id
)

select t.*
from ticket t
  inner join a on a.user_id = t.user_id
where a.marked = 0

我故意省略了user,因为它没有增加任何价值。

【讨论】:

    【解决方案2】:

    如果没有更多信息,我会犹豫回答,但子查询可能会有所帮助。 设置并发布一个排斥让我们尝试一下。

    如果您不熟悉,这里有一个关于子查询的简短视频。 https://www.youtube.com/watch?v=GpC0XyiJPEo&t=417s

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 2014-11-07
    • 2016-05-27
    • 2019-07-01
    相关资源
    最近更新 更多