Portál AbcLinuxu, 7. května 2025 06:02
+----------+-----------------------------+ | 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 <= 10Nezkouš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.