簡體   English   中英

組內的mysql限制?

[英]mysql limit inside group?

我想限制組內記錄的大小,這是我的試用版,如何做到對不對?

mysql> select * from accounts limit 5 group by type;

錯誤1064(42000):您的SQL語法有錯誤; 檢查與MySQL服務器版本對應的手冊,以便在第1行的“按類別分組”附近使用正確的語法

聚合函數(以及它需要的GROUP BY)的要點是將許多行轉換為一行。 因此,如果您真的只想要前5個儲蓄賬戶和前5個支票賬戶以及前5個美元賬戶等,您需要的更像是:

條件:account_balance特定帳戶類型的前5位

SELECT account_type, account_balance FROM accounts WHERE account_type='savings' 
   ORDER BY account_balance DESC LIMIT 5
UNION
SELECT account_type, account_balance FROM accounts WHERE account_type='chequing' 
   ORDER BY account_balance DESC LIMIT 5
UNION
SELECT account_type, account_balance FROM accounts WHERE account_type='USD' 
   ORDER BY account_balance DESC LIMIT 5;

它並不漂亮,但如果您使用腳本構造SQL,則在account_types中進行子搜索並將查詢連接在一起是很簡單的。

我使用編號的行有一些運氣:

set @type = '';
set @num = 0;

select
  items.*,
  @num := if(@type = item_type, @num + 1, 1) as dummy_1,
  @type := item_type as dummy_2,
  @num as row_number
from items
group by
  item_type,
  row_number
having row_number < 3;

這將為每個item_type提供2個結果。 (有一個問題:請確保您重新運行前兩周set的語句,否則你的行數將穩步越來越高和row_number < 3的限制將無法正常工作。

我從幾個 帖子中拼湊出來,這些帖子已經在SO上的其他答案中聯系起來了。

嘗試在GROUP BY子句后面放置LIMIT子句。

編輯:試試這個:

SELECT * 
FROM accounts a1
WHERE 5 > 
(
   SELECT COUNT(*)
   FROM accounts a2
   WHERE a2.type = a1.type
   AND a2.balance > a1.balance
)

這將返回最多5個具有最大余額的每種類型的帳戶。

您似乎希望限制整個結果集的每個組中返回的行數...這很難以可擴展的方式進行。 一種技術是在同一個表上執行N個連接,其條件是匹配的唯一行是您想要的頂部/底部N.

這個頁面可能會為您的解決方案提供一些額外的見解...雖然返回每組中的前5名會很快變得難看。

分組用於聚合函數(總和,平均值......)

允許您將聚合結果拆分為組。 您尚未使用這些功能之一。

我不確定你可以在組中使用限制。 如果你的group by是一個返回一行/值的子選擇,你可以使用它。 例如:

select * from foo order by(從foo2 limit 1中選擇foo2.id)

我只是猜測這會奏效。

這可能會成功,但如果type沒有索引,它將是sloooowwww 即使有一個,它也不是特別快:

SELECT a.*
FROM accounts a
     LEFT JOIN accounts a2 ON (a2.type = a.type AND a2.id < a.id)
WHERE count(a2.id) < 5
GROUP BY a.id;

更好的選擇是按type order列表,然后在業務層使用循環來刪除您不想要的行。

@ dnagirl的答案幾乎有它,但由於某種原因,我的MySQL版本只返回第一個LIMIT'd集。 為了解決這個問題,我將每個語句放入子查詢中

SELECT * FROM (
    SELECT account_type, account_balance FROM accounts WHERE account_type='savings' 
       ORDER BY account_balance DESC LIMIT 5
) as a
UNION
SELECT* FROM (
    SELECT account_type, account_balance FROM accounts WHERE account_type='chequing' 
       ORDER BY account_balance DESC LIMIT 5
) as b
UNION
SELECT * FROM (
    SELECT account_type, account_balance FROM accounts WHERE account_type='USD' 
       ORDER BY account_balance DESC LIMIT 5
) as c

這讓我回到最終結果集中的每一組結果。 否則,我只會從第一個查詢獲得前5個而沒有別的 - 不確定它是否只是我的版本的一些MySQL funk

暫無
暫無

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

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