對于關聯查詢本人在開發應用中使用得很少,因為我處理數據量都非常的大所以關聯對我來說可能導致數據庫訪問緩存,今天看到一朋友寫了一篇關于mysql一對多關聯查詢的時候篩選條件看了有點意思于是與大家分享.
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
- //開源代碼Vevb.com
然后針對每一行記錄X,拿出這一行X與 一個新的auth_token_log表做join,然后篩選出 log.user_id = x..user.id的所有記錄,查出max(id),這就是最新的log記錄的 id.
新聞熱點
疑難解答