簡體   English   中英

MySQL排名前十

[英]MySQL Sorting By Top 10

我正在為我的團隊創建鍛煉日志。 我目前擁有的是一個MySQL查詢(用PHP編寫),該查詢檢索與當前一周內發布的帖子相關的用戶ID數組。 代碼如下:

mysql_query("SELECT u_id FROM posts WHERE id IN (SELECT p_id FROM post_groups WHERE g_id='" . $group['id']. "') AND date >= '" . $d_start . "' AND date <= '" . $d_end . "'");

為了更好地解釋這一點,假設一個u_id = 6的用戶本周發布了五次鍛煉。 由上述查詢生成的數組應包含6 ,總共5次。 這是針對用戶在一周內發布的所有鍛煉而完成的-因此,最終我得到了一大堆重復的用戶ID。

我想要做的是,返回一個大小為10的數組,其中包含在上面的數組中出現頻率最高的u_id 因此,如果u_id = 6在上面的數組中出現頻率最高,比如說10次,而u_id = 8在第二個數組中出現頻率第二高,比如說9次,那么我希望返回的數組的值為6 [0]和[1]處的值為8 ,依此類推。

我不確定如何縮減此數組並按u_id的最頻繁出現對其進行u_id ,因為目前我的SQL技能還有些不足。 我希望有人能夠闡明我正在尋找的理想查詢。 我感謝您的幫助!

聽起來您想同時使用GROUP BYORDER BYTOP

GROUP BY將按特定字段將結果分組,在這種情況下,您要按u_id分組。

GROUP BY u_id

ORDER BY使您可以訂購結果集。 在此示例中,您COUNT()每個用戶有多少行的COUNT()分組。 我們還使用DESC關鍵字對它們進行降序排列(從最高到最低)。

ORDER BY COUNT(u_id) DESC

TOP只讓您獲得前X個結果。 在下面的示例中,僅返回前10行。

TOP 10

因此,將所有內容放在一起,以用戶ID分組,以每個用戶ID的降序排列,並將結果限制為10:

SELECT u_id 
FROM posts 
WHERE id IN 
  (SELECT p_id 
   FROM post_groups 
   WHERE g_id='" . $group['id']. "') 
AND date >= '" . $d_start . "' 
AND date <= '" . $d_end . "'
GROUP BY u_id
ORDER BY COUNT(u_id) DESC
LIMIT 10

附帶說明...實際上不應該在新代碼中使用mysql_ *函數 它們不再被維護並且已正式棄用 (這意味着它們將在以后的PHP版本中刪除)。 而是考慮將准備好的語句與MySQLiPDO一起使用

這里有很多使用PDO的好例子, 這里還有使用MySQLi的好例子。

暫無
暫無

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

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