[英]Running multiple queries in MySQL without using sub-query
我有兩個表,一個叫做users
表,
fsname
emailaddress
和第二個表調用了emailaddress
, score
和datetime
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";
此查詢首先假設按datetime
對attempts
進行排序,並且僅選擇具有不同名字的值,即fsname
over here。
但是當我執行上面的查詢時,它返回的結果具有非唯一的fsname
值,盡管我正在使用帶有fsname
DISTINCT
。
任何人都可以告訴我為什么DISTINCT
不工作只選擇不同的fsname
?
我已經嘗試了DISTINCT fsname
和DISTINCT(fsname)
但這些都沒有用。
它不會像您認為的那樣工作, 文檔解釋了DISTINCT
的含義:它是關於不同的行 :
ALL
和DISTINCT
選項指定是否應返回重復的行。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
最新條目的行。
為了快速運行此查詢( 任何查詢! )需要在JOIN
, WHERE
, GROUP BY
和ORDER 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.