簡體   English   中英

在MySQL中運行多個查詢而不使用子查詢

[英]Running multiple queries in MySQL without using sub-query

我有兩個表,一個叫做users表,

fsname
emailaddress

和第二個表調用了emailaddressscoredatetime attempts

現在我想要做的是首先按datetime排序attempts表,然后選擇然后加入帶有users表的attempt表,如果它們具有相同的emailaddress ,然后選擇每個唯一用戶的最終嘗試。

簡而言之,我必須通過加入這些表來選擇每個用戶的最后一次嘗試,這是我為實現此目的而生成的查詢,

$query = "SELECT 
            distinct users.fsname, users.emailaddress, attempts.score 
            FROM users 
            INNER JOIN attempts 
            ON users.emailaddress = attempts.emailaddress 
            ORDER BY datetime DESC";

此查詢首先假設按datetimeattempts進行排序,並且僅選擇具有不同名字的值,即fsname over here。

但是當我執行上面的查詢時,它返回的結果具有非唯一的fsname值,盡管我正在使用帶有fsname DISTINCT

任何人都可以告訴我為什么DISTINCT不工作只選擇不同的fsname

我已經嘗試了DISTINCT fsnameDISTINCT(fsname)但這些都沒有用。

它不會像您認為的那樣工作, 文檔解釋了DISTINCT的含義:它是關於不同的

ALLDISTINCT選項指定是否應返回重復的行。 ALL (默認值)指定應返回所有匹配的行,包括重復行。 DISTINCT指定從結果集中刪除重復的行。 指定兩個選項都是錯誤的。 DISTINCTROW是同義詞DISTINCT

(來源: http//dev.mysql.com/doc/refman/5.7/en/select.html

您需要按用戶對行進行分組,以便為​​每個用戶獲取一行,但遺憾的是,您無法通過這種方式獲得最新的分數。 您可以獲得最大值,最小值,平均值和其他計算值。 檢查GROUP BY聚合函數列表。

查詢

這是獲取所需值的查詢:

SELECT u.fsname, u.emailaddress, la.score 
FROM users u
INNER JOIN attempts la                # 'la' from 'last attempt'
    ON u.emailaddress = la.emailaddress
LEFT JOIN attempts mr                 # 'mr' from 'more recent' (than last attempt)
    ON la.emailaddress = mr.emailaddress AND la.datetime < mr.datetime
WHERE mr.datetime IS NULL

這個怎么運作

它使用emailaddress作為匹配列,將表users (別名為u )與表attempts (別名為la ,“最后一次嘗試”的縮寫)連接起來。 這是你在查詢中已經擁有的連接,我添加了別名,因為它們可以幫助你減少從那一點開始寫的內容。

接下來,加入attempts再次表(別名為mr從“比上一次嘗試更近 ”)。 它匹配來自la每次嘗試以及來自同一用戶的mr (由他們的emailaddress標識)的所有嘗試並且具有更新的datetime LEFT JOIN確保la中的每一行與mr至少一行匹配。 la中沒有匹配的行是mr是每個emailaddress具有最大datetime值的行。 它們與滿NULL行匹配(對於mr部分)。

最后, WHERE子句僅保留從mr選擇的行的datetime列中具有NULL的行。 這些是與emailaddress每個值匹配la最新條目的行。

表現評論

為了快速運行此查詢( 任何查詢! )需要在JOINWHEREGROUP BYORDER BY子句中使用的列上的索引。

您不應在表attempts使用emailaddress來識別用戶。 您應該在表users使用PK (主鍵),並在表attempts (以及引用用戶的其他表)中將其用作FK (外鍵)。 如果emailaddress是表的users PK ,則將其更改為UNIQUE INDEX並使用新的INTEGER AUTO INCREMENT ed列userId作為PK 數字列上的索引比字符串列上的索引更快,占用的空間更少。

暫無
暫無

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

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