簡體   English   中英

連接三個MySQL表並從一個表中獲取最大值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM