MySQL 多表查询简单实现(一看就会)

 

编写一个SQL查询来报告 Person 表中每个人的姓、名、城市和州。如果 personId 的地址不在 Address 表中,则报告为空  null 。

以 任意顺序 返回结果表。

示例 :

Person表:
+----------+----------+-----------+
| personId | lastName | firstName |
+----------+----------+-----------+
| 1        | Wang     | Allen     |
| 2        | Alice    | Bob       |
+----------+----------+-----------+
Address表:
+-----------+----------+---------------+------------+
| addressId | personId | city          | state      |
+-----------+----------+---------------+------------+
| 1         | 2        | New York City | New York   |
| 2         | 3        | Leetcode      | California |
+-----------+----------+---------------+------------+
输出: 
+-----------+----------+---------------+----------+
| firstName | lastName | city          | state    |
+-----------+----------+---------------+----------+
| Allen     | Wang     | Null          | Null     |
| Bob       | Alice    | New York City | New York |
+-----------+----------+---------------+----------+

解释: 
地址表中没有 personId = 1 的地址,所以它们的城市和州返回 null。
addressId = 1 包含了 personId = 2 的地址信息。

【思路】

从表的结构可以看出,表1(Person)是人的姓名信息,表2(Address)是人的地址信息。

1)考虑到有的人可能没有地址信息,要是查询结构要查所有人,需要保留表1(Person)里的全部数据,所以用左联结(left join)

2)两个表联结条件:两个表通过personId产生联结。

所以可知查询代码如下

SELECT  a.firstName,a.lastName,b.city,b.state
FROM Person as a left join Address as b
on a.personId=b.personId;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在service实现多表查询加分页查询,需要先定义好多表查询SQL语句和分页查询的参数,然后在service中进行调用和处理。 以下是一个示例代码: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public List<User> findUsersByPage(int pageNo, int pageSize) { int offset = (pageNo - 1) * pageSize; List<User> userList = userDao.findUsersByPage(offset, pageSize); return userList; } @Override public List<User> findUsersByConditionAndPage(String name, int pageNo, int pageSize) { int offset = (pageNo - 1) * pageSize; List<User> userList = userDao.findUsersByConditionAndPage(name, offset, pageSize); return userList; } @Override public List<User> findUsersAndOrdersByPage(int pageNo, int pageSize) { int offset = (pageNo - 1) * pageSize; List<User> userList = userDao.findUsersAndOrdersByPage(offset, pageSize); return userList; } } ``` 在上面的示例代码中,我们定义了三个方法用于实现不同的多表查询和分页查询功能: 1. `findUsersByPage`方法用于实现简单的分页查询,查询结果为单表记录。 2. `findUsersByConditionAndPage`方法用于实现带有条件的分页查询,查询结果为单表记录。 3. `findUsersAndOrdersByPage`方法用于实现多表查询和分页查询,查询结果为多表记录。 在每个方法中,我们都需要先计算出分页查询的偏移量(offset),然后调用Dao层的方法进行查询并返回结果。 其中,Dao层的方法实现可以参考以下示例代码: ```java @Repository public interface UserDao { @Select("SELECT * FROM user LIMIT #{offset}, #{pageSize}") List<User> findUsersByPage(@Param("offset") int offset, @Param("pageSize") int pageSize); @Select("SELECT * FROM user WHERE name LIKE CONCAT('%',#{name},'%') LIMIT #{offset}, #{pageSize}") List<User> findUsersByConditionAndPage(@Param("name") String name, @Param("offset") int offset, @Param("pageSize") int pageSize); @Select("SELECT u.*, o.* FROM user u LEFT JOIN orders o ON u.id = o.user_id LIMIT #{offset}, #{pageSize}") @Results({ @Result(id = true, column = "id", property = "id"), @Result(column = "name", property = "name"), @Result(column = "id", property = "orders", many = @Many(select = "com.example.demo.dao.OrderDao.findOrdersByUserId")) }) List<User> findUsersAndOrdersByPage(@Param("offset") int offset, @Param("pageSize") int pageSize); } ``` 在Dao层的方法中,我们使用了@Select注解来定义SQL语句,同时使用@Param注解来传递参数。对于多表查询,我们还需要使用@Results注解来定义查询结果的映射关系。 最后,我们在Controller层调用service方法来获取查询结果并进行展示。 ```java @RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping public List<User> getUsers(@RequestParam(value = "name", required = false) String name, @RequestParam(value = "pageNo", defaultValue = "1") int pageNo, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) { if (name != null) { return userService.findUsersByConditionAndPage(name, pageNo, pageSize); } else { return userService.findUsersByPage(pageNo, pageSize); } } @GetMapping("/orders") public List<User> getUsersAndOrders(@RequestParam(value = "pageNo", defaultValue = "1") int pageNo, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) { return userService.findUsersAndOrdersByPage(pageNo, pageSize); } } ``` 在Controller层中,我们定义了两个接口分别用于单表记录查询和多表记录查询,通过@RequestParam注解来获取查询条件和分页参数。最后返回查询结果即可。 以上就是在service实现mysql多表查询加分页查询的全部内容,希望能对大家有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值