Home >Database >Mysql Tutorial >mysql一对多关联查询的时候筛选条件

mysql一对多关联查询的时候筛选条件

WBOY
WBOYOriginal
2016-06-07 16:18:121380browse

mysql实现users 表和 logoin_log表是一对多, 现在是把user的信息找出来 关联上一些 logoin_log表的数据, 因为a表是多的一方,要多他的数据进行一些条件匹配,这个sql目的是查出每个用户的最新的log记录 有的人建议进行表连接来进行筛选,不过那样很麻烦,

   mysql实现users 表和 logoin_log表是一对多, 现在是把user的信息找出来 关联上一些 logoin_log表的数据, 因为a表是多的一方,要多他的数据进行一些条件匹配,这个sql目的是查出每个用户的最新的log记录

  有的人建议进行表连接来进行筛选,不过那样很麻烦,小涛我断然拒绝了,然后我采用了另一个巧妙的方法:

  列表的时候采用先查一个表,,这里查的是users表,然后再传值到方法,该方法进行封装查询logoin_log,此时要通过id倒序排列,返回相应的值,这样就可以获得最新的log记录了,这样是不是更简单呢,得意……坚决用表连接的盆友们,赶快试试这种方法吧。

  users 表和 auth_token_log表是一对多, 现在是把user的信息找出来 关联上一些 auth_token_log表的数据, 因为a表是多的一方,

  要多他的数据进行一些条件匹配

  这个sql目的是查出每个用户的最新的log记录

  原始写法

 代码如下  


SELECT
 users.first_name,
 users.email_address,
 users.tp_user_id,
 users.tp_username,
 auth_token_log.module_access,
 auth_token_log.created_date
FROM
 users
 INNER JOIN auth_token_log ON users.id = auth_token_log.user_id
WHERE
 auth_token_log.id in(
  SELECT
  max(id)
FROM
  auth_token_log
WHERE
  auth_token_log.user_id = users.id
 )

 

  自己的理解

 代码如下  


SELECT
 users.first_name,
 users.email_address,
 users.tp_user_id,
 users.tp_username,
 auth_token_log.module_access,
 auth_token_log.created_date
FROM
 users
 INNER JOIN auth_token_log ON users.id = auth_token_log.user_id
WHERE
 auth_token_log.id in(
  SELECT
  max(auth_token_log.id)
FROM
  auth_token_log,
  users
WHERE
  auth_token_log.user_id = users.id
GROUP BY
  users.id
 )  

  对于原始写法的理解是

  先查出

 代码如下  

SELECT
 ×
FROM
 users
 INNER JOIN auth_token_log ON users.id = auth_token_log.user_id

  的记录, 然后针对每一行记录X,拿出这一行X与 一个新的auth_token_log表做join,然后筛选出 log.user_id = x..user.id的所有记录, 然后查出max(id), 这就是最新的log记录的 id

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn