![](/img/trans.png)
[英]Joining three columns from three tables and then grouping the distinct values in the first column by the maximum value in the third column
[英]Joining Three MySQL Tables and Get The Maximum Value From One Table
我想加入三個表。
第一個是“用戶”表。
+---------+--------------+---------+
|Id |UserName |blah |
+---------+--------------+---------+
|1 |Amila |blah |
+---------+--------------+---------+
|2 |Kamal |blah |
+---------+--------------+---------+
|3 |Nuwan |blah |
+---------+--------------+---------+
第二個是“圖像”表。 它包含用戶上傳的所有圖像。 同樣,如果Type == PI並且最大ID將是用戶的當前個人資料圖片。
+---------+--------------+---------+---------+
|Id |Image |Type |User |
+---------+--------------+---------+---------+
|1 |12358.jpg |PI |1 |
+---------+--------------+---------+---------+
|2 |12589.jpg |PI |2 |
+---------+--------------+---------+---------+
|3 |45862.jpg |Other |2 |
+---------+--------------+---------+---------+
|4 |35698.jpg |PI |1 |
+---------+--------------+---------+---------+
第三個“評論”表包含所有評論。
+---------+--------------+---------+
|Id |Comment |User |
+---------+--------------+---------+
|1 |blah blah... |1 |
+---------+--------------+---------+
|2 |blah blah... |1 |
+---------+--------------+---------+
|3 |blah blah... |2 |
+---------+--------------+---------+
我想做的是編寫一個返回的查詢
Users.Id,Users.UserName,Images.Image(最大Id和Type == PI),Comments.Id,Comments.Comment
基本上,所有這些都是關於聯接三個表的。
這是我的代碼
SELECT U.`Id`, U.`UserName`, I.`Image`, C.`Id`, C.`Comment`
FROM `Users` U
INNER JOIN `Images` I ON I.`Image` = (
SELECT MAX(I.`Image`) FROM `Images` WHERE I.`User` = U.`Id`
) AND I.`Type` = 'PI'
INNER JOIN `Comments` C ON C.`User` = U.`Id`
但這會返回“圖像”表中的所有圖像。 例如,它返回用戶1的兩個圖像。我只需要最后上傳的圖像。
您需要對降序的結果進行排序,以使最后的結果排在最前面,然后將結果限制為1。
SELECT U.`Id`, U.`UserName`, I.`Image`, C.`Id`, C.`Comment`
FROM `Users` U
INNER JOIN `Images` I ON I.`User`=U.`Id`
INNER JOIN Comments c ON C.`User` = U.`Id`
WHERE I.`Id` IN ( SELECT MAX(`Id`) FROM `Images` GROUP BY `User` )
ORDER BY I.`Image` DESC
LIMIT 1
這將為您提供所需的結果。 在子查詢上具有LEFT JOIN
的目的是為每個用戶名創建一條記錄,即使該用戶名在表Images
上沒有匹配的記錄也是如此。 LEFT JOIN
上的子查詢還有一個子查詢,它為每個user
獲取最新的升級image
。
SELECT a.Id,
a.UserName,
c.Image,
b.Id,
b.Comment
FROM User a
INNER JOIN Comments b
ON a.ID = b.User
LEFT JOIN
(
SELECT i.*
FROM Images i
INNER JOIN
(
SELECT User, MAX(ID) ID
FROM Images
WHERE Type = 'PI'
GROUP BY User
) o ON i.User = o.User
AND i.ID = o.ID
) c ON a.ID = c.User
否則,如果您確定表Images
上至少有一條匹配記錄,則可以對所有聯接使用INNER JOIN
,
SELECT a.Id,
a.UserName,
c.Image,
b.Id,
b.Comment
FROM User a
INNER JOIN Comments b
ON a.ID = b.User
INNER JOIN Images c
ON a.ID = c.User
INNER JOIN
(
SELECT User, MAX(ID) ID
FROM Images
WHERE Type = 'PI'
GROUP BY User
) o ON i.User = o.User
AND i.ID = o.ID
我認為這是您針對的查詢:
SELECT U.`Id`, U.`UserName`, I.`Image`, C.`Id`, C.`Comment`
FROM `Users` U INNER JOIN
`Images` I
ON I.id = (SELECT MAX(I.id)
FROM `Images`
WHERE `User` = U.`Id` and `Type` = 'PI'
) INNER JOIN
`Comments` C
ON C.`User` = U.`Id` ;
我確實發現這是一種編寫查詢的奇怪方法。 我的傾向是在單獨的步驟上進行max()
比較:
SELECT U.`Id`, U.`UserName`, I.`Image`, C.`Id`, C.`Comment`
FROM `Users` U INNER JOIN
`Images` I
ON i.`User` = U.`Id` INNER JOIN
(select user, max(I.id) as maxid
FROM `Images`
WHERE `Type` = 'PI'
) maxi
ON i.id = maxi.maxid join
`Comments` C
ON C.`User` = U.`Id` ;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.