【问题标题】:SQL join where only the max value should be returned只返回最大值的 SQL 连接
【发布时间】:2014-03-14 07:49:06
【问题描述】:

寻求有关 SQL 的帮助。我有以下4张桌子

用户表

+-----------------------------+
| ID | First_Name | Last_Name |
+-----------------------------+
| 1  | Billy      | O'Neal    |
+----+------------+-----------+
| 2  | John       | Skeet     |
+----+------------+-----------+
| 3  | Ken        | Stamp     |
+----+------------+-----------+
| 4  | Doug       | Feng      |
+----+------------+-----------+

Book_CheckOut

+----+--------------+---------------+
| ID | User_ID      | Book_ID       |
+-----------------------------------+
| 1  | 1            | 1             |
+----+--------------+---------------+
| 2  | 2            | 3             |
+----+--------------+---------------+
| 3  | 2            | 1             |
+----+--------------+---------------+
| 4  | 2            | 2             |
+----+--------------+---------------+
| 5  | 3            | 1             |
+----+--------------+---------------+
| 6  | 1            | 4             |
+----+--------------+---------------+
| 7  | 1            | 0             |
+----+--------------+---------------+

书籍

+---------+-------------+-------------+
| ID      | Book_Name   | Location_ID |
+-----------------------+-------------+
| 1       | Programming | 1           |
+---------+-------------+-------------+
| 2       | Cooking     | 3           |
+---------+-------------+-------------+
| 3       | Dancing     | 2           |
+---------+-------------+-------------+
| 4       | Sports      | 1           |
+---------+-------------+-------------+

位置

+---------+-------------+
| ID      | Loc_Name    |
+-----------------------+
| 1       | Palo Alto   |
+---------+-------------+
| 2       | San Jose    |
+---------+-------------+
| 3       | Oakland     |
+---------+-------------+
| 4       | Cupertino   |
+---------+-------------+

我想要找出所有已签出最新图书的人。如果这个人没有任何记录,他应该出现。如果没有匹配的书籍,例如 0,则表示此人已归还所有书籍。他也应该出现。

最终结果

 Record
+-----------------+----------------+----------------+
| First_Name      | Book_Name      | Loc_Name       |
+-----------------+----------------+----------------+
| Billy           |                |                |
+-----------------+----------------+----------------+
| John            | Cooking        | Oakland        |
+-----------------+----------------+----------------+
| Ken             | Programming    | Palo Alto      |
+-----------------+----------------+----------------+
| Doug            |                |                |
+-----------------+----------------+----------------+

自从他在 Book_CheckOut 中的最后一条记录为 0 以来,Billy 什么都没有,而 Doug 什么也没有,因为在 Book_CheckOut 中没有他的记录。

我已经尝试过使用 MAX() 和 group by 进行各种连接,但似乎没有一种方法可以满足我正在寻找的所有内容。

非常感谢任何帮助。

【问题讨论】:

标签: sql database join unique


【解决方案1】:

试试这个:

select
  u.first_name,
  b.book_name,
  l.loc_name
from user u 
  left join (select * 
             from book_checkout t0 
             where id = (select 
                           max(id)
                         from book_checkout
                         where user_id = t0.user_id
                        )
            ) bc on bc.user_id = u.id
  left join books b on b.id = bc.book_id
  left join location l on l.id = b.location_id

第一个连接语句中的子查询用于仅选择每个用户的最后一条记录。但是这个查询被认为是每个用户一次只结账一本书。

让我知道它是否有效)

【讨论】:

    【解决方案2】:
            SELECT    LC.First_Name
                    , ISNULL(B.Book_Name, N'') AS BookName
                    , ISNULL(L.Loc_Name, N'') AS Loc_Name
              FROM  Books AS B 
        INNER JOIN  Book_CheckOut AS BC ON B.ID = BC.Book_ID 
        INNER JOIN  Location AS L ON B.ID = L.ID 
       RIGHT OUTER JOIN (SELECT U.First_Name
                          , ISNULL(MAX(BC.ID), 0) AS BCID
                       FROM Users AS U
            LEFT OUTER JOIN Book_CheckOut AS BC ON U.ID = BC.User_ID
                   GROUP BY U.First_Name) AS LC ON BC.ID = LC.BCID
    

    子查询显示所有用户的 Last CheckOut。

    【讨论】:

      【解决方案3】:
      select First_Name, Book_Name, Location_Name 
      from Users U, (select * from Books_Checkout where ID in (select max(ID) from Books_Checkout group by User_ID) and Book_ID is not null order by ID) BC, Books B, Location L 
      where U.ID = BC.User_ID and B.ID = BC.Book_ID and L.ID = B.Location_ID;
      

      以上查询结果:

      John    Cooking   Oakland
      Ken     Programming Palo Alto
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        • 2011-09-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多