簡體   English   中英

MySQL的左聯接最大自動增量ID?

[英]mysql leftjoin by max autoincrement id?

A)用戶

B)訂閱

C)包裝信息

我有一個表,其中BAC之間的鏈接,是從A中選擇的查詢,其中B具有A行ID,並通過B ID將C連接起來。


完整示例:

SELECT a.*,c.packageTitle
FROM users AS a
LEFT JOIN subscribe AS b ON (b.userid = a.userid)
LEFT JOIN package AS c ON (b.packageid = c.packageid)

我的問題是,如果用戶在C具有多個預訂,則無法在循環查詢中獲取最新的預訂行,我也使用SELECT內的MAX(c.packageid)也失敗了。


目標 :獲取由A id分配的B中的最新記錄。

任何建議都非常感謝

我認為嘗試使用MAX()獲取具有最新程序包ID(假設此ID是一個遞增的自動增量列)的記錄並不遙遠。 在下面的答案中,子查詢使用GROUP BY為每個用戶記錄標識最新的軟件包ID。 然后,此子查詢用於從原始查詢中過濾正確的記錄。

SELECT a.userid, b.*
FROM users AS a
LEFT JOIN subscribe AS b
    ON b.userid = a.userid
LEFT JOIN package AS c
    ON b.packageid = c.packageid
INNER JOIN
(
    SELECT a.userid, MAX(c.packageTitle) AS maxPackageTitle
    FROM users AS a
    LEFT JOIN subscribe AS b
        ON b.userid = a.userid
    LEFT JOIN package AS c
        ON b.packageid = c.packageid
    GROUP BY a.userid
) t
    ON a.userid = t.userid AND c.packageTitle = t.maxPackageTitle

需要注意的是,該查詢將大大受益於稱為公用表表達式(CTE)的東西,該表達式可在其他RBDMS(如SQL Server和Oracle)中使用。 CTE將使查詢的重復性降低,可讀性更高。

這應該足夠簡單。 正如您所說的,在Mysql中,將最大選擇與group by一起放置。 所以它看起來像:

SELECT username, id_info, ...
FROM
(
    SELECT a.username, a.id_info, c.packageTitle, MAX(package_id)
    FROM users AS a
    LEFT JOIN subscribe AS b
        ON b.userid = a.userid
    LEFT JOIN package AS c
        ON b.packageid = c.packageid
    GROUP BY a.username, a.id_info, c.packageTitle
)

記住要列出選擇中也要分組的所有列,但要采用最大值的列除外,否則查詢將失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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