【问题标题】:Get list of items with name or null based on another table values根据另一个表值获取名称或 null 的项目列表
【发布时间】:2016-03-12 13:05:30
【问题描述】:

我有这样的架构:

现在我想写一个查询,它只在现在借书的情况下返回带有借书人姓名的项目列表,否则借书人姓名应该为空。 我觉得应该很容易;我一直在尝试使用多个连接和 NULL 条件,但我仍然无法得到我想要的。也许我应该改变我的架构?

【问题讨论】:

  • 你怎么知道这本书现在是否被借? return_date NULL 吗?一些示例数据会很有帮助。
  • 是的,现在借书时return_date为NULL。可以吗,还是我应该添加状态或smth?
  • 如果这不是某种练习,那么我会简单地进行两次查询。是锻炼吗?
  • @Jonas Tonny 不,但我想在一个查询中获取这些值,存储为 java 对象并在视图中显示 (JSP)
  • @JonasTonny 我很想看到一些证据来支持这一说法。使用两个连接执行单个查询没有任何问题。

标签: mysql sql jpql


【解决方案1】:
SELECT items.*, borrowers.first_name, borrowers.last_name
FROM items
LEFT JOIN borrows ON borrows.item_id = items.id AND return_date IS NULL
LEFT JOIN borrowers ON borrowers.id = borrows.borrower_id

【讨论】:

    【解决方案2】:

    这样的事情应该可以解决问题:

    select Items.title, case when b1.return_date is null then b2.first_name || ' ' || b2.last_name else null end as 'Borrower name' from Items i join Borrows b1 on b1.item_id = i.id join Borrowers b2 on b2.id = b1.borrower_id

    这总是选择项目的标题,并连接借用者的名字和姓氏,但前提是 return_date 为空。否则,选择null作为'Borrower name'

    【讨论】:

      【解决方案3】:

      您可以在Borrowers 表上使用LEFT OUTER JOIN 执行此操作,条件是return_date IS NULL

      这应该适合你:

      Select      I.*,
                  B.First_Name,
                  B.Last_Name
      From        Borrows     W
      Join        Items       I   On  W.item_id = I.Id
      Left Join   Borrowers   B   On  W.borrower_id = B.id
                                  And W.return_date Is Null
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-06
        • 1970-01-01
        • 1970-01-01
        • 2019-03-01
        相关资源
        最近更新 更多