reklama

Kombinace Where a Having (SQL)

Kombinace Where a Having (SQL)
« kdy: 23. 02. 2020, 11:26:21 »
Dal by se tento příkaz modifikovat tak, aby k současné podmínce přibyly další dvě?

Kód: [Vybrat]
SELECT count(p.id) as c FROM posts AS p WHERE p.poster_id=7 AND (1582453177 - p.posted)<301 AND left( p.message, 21)='Testujeme nÄ›jakej zaj'  ORDER BY p.posted DESC LIMIT 5
První podmínka:
Kód: [Vybrat]
(1582453177 - p.posted)<301 AND left( p.message, 21)='Testujeme nÄ›jakej zaj' )* Testuje, jestli uživatel během 5 minut odeslal nějaký podobný příspěvek

Druhá podmínka:
* Zjisti jestli uživatel během půl hodiny odeslal více než 10 příspěvků (respektive vrať počet)

Třetí podmínka:
* Zjisti jestli uživatel během 24 hodin neodeslal víc než 25 příspěvků.

Našel jsem, že existuje klauzule HAVING která umožňuje omezit počet záznamů podle toho kolik výsledků najde, ale nepřišel jsem na to jak to skombinovat s WHERE.

Pseudo kód bez HAVING bych si představoval nějak takto ():

SELECT count(p.id) as c FROM posts AS p WHERE p.poster_id=7 AND ( (1582453177 - p.posted)<301 AND left( p.message, 21)='Testujeme nějakej zaj' OR ( (1582453177 - p.posted)<1801 ) AND c>10 ) ORDER BY p.posted DESC LIMIT 5
« Poslední změna: 23. 02. 2020, 11:35:11 od exkalibr »

reklama


Logik

  • *****
  • 801
    • Zobrazit profil
    • E-mail
Re:Kombinace Where a Having (SQL)
« Odpověď #1 kdy: 23. 02. 2020, 17:49:36 »
- Having je klauzule pro omezování záznamů slučovaných pomocí Group by. Na todle není.

- Tady prostě si každou podmínku vyjádři jako samostatný dotaz a pak udělej or na subselecty.


Re:Kombinace Where a Having (SQL)
« Odpověď #2 kdy: 25. 02. 2020, 13:18:19 »
Podmínka na "podobný příspěvek se musí vyřešit v samostatném dotazu", zbytek jestli nespamuje např. více než 10x za 5minut nebo 25x za 24hodin to lze jedním dotazem (pro přehlednost jsem timestamp změnil na date)

Kód: [Vybrat]
SELECT COUNT(*)
FROM post
WHERE 1
  # Omezeni na posty pouze za poslednich 24h (respektive na nejdelší časovou podmínku), at se neprochazi vsechna data. index (user_id, date)
  AND post.user_id = @user_id
  AND post.date > (NOW() - INTERVAL 24 HOUR)

HAVING
 # pocet prispevku za poslednich 5minut vetsi nez 10
 COUNT(IF(post.date> NOW() - INTERVAL 5 MINUTE, post.id, NULL)) > 10
OR
 # Nebo 25prispevku za 24hdoin
 COUNT(IF(post.date> NOW() - INTERVAL 24 HOUR, post.id, NULL)) > 25
« Poslední změna: 25. 02. 2020, 13:23:04 od fos4 »

 

reklama