Portál AbcLinuxu, 25. prosince 2025 03:15
+----------+-----------------------------+ | domain | email | +----------+-----------------------------+ | atlas.cz | karel@atlas.cz | | atlas.cz | pepa@atlas.cz | | atlas.cz | borivoji@atlas.cz | | atlas.cz | magdalena@atlas.cz | +----------+-----------------------------+mam zde hodne atlas.cz, seznam.cz gmail.com atd.. A potrebuju od kazde domeny vybrat pouze 10 emailu idealne v jednom selectu. Je to vubec mozne? Uz par hodin se snazim spravne zeptat google a zatim bez uspechu, Je mi jedno zda to bude postgre, nebo mysql. Projizdim dokumentaci, ale nenapada me ani moc jak bych to realizoval a kdyz to bude v kodu, bojim se spatneho vykonu, samozrejme me napadlo udelat neco takoveho:
adr_list = []
domains = db.query("select domain, count(email) as cnt from recipients group by domain having cnt > 10")
adr_list.append(db.query("""select email from recipients where domain not in (select domain from (select domain, count(email) as cnt from recipients group by domain having cnt > 10) as tmp);""")
for dom in domains:
adr_list.append("select email from recipients LIMIT 10;" % dom)
ale radeji bych to udelal spravne a neco se rovnou priucil.
Predem dekuji za rady a postouchnuti...
Řešení dotazu:
SELECT
*
FROM (
SELECT
ROW_NUMBER() OVER (PARTITION BY domain ORDER BY email) AS rowno,
email
FROM
emails
) t
WHERE rowno <= 10
Nezkoušel jsem to, možná tam jsou nějaké detaily špatně. V MySQL to jde zprasit přes proměnnou, což většinou funguje. Dá se udělat i korelovaný poddotaz, který bude počítat rowno, ale efektivita jde do háje.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.