Ik ben al de hele ochtend aan het stoeien en kom er maar niet uit. Ik probeer uit een grote tabel (meer dan 100,000 records) het aantal ip's te selecteren dat minder dan x keer voor komt; laat zeggen in dit geval 3.
De tabel is klein en bestaat uit:
- ip (varchar, 15)
- site (tinyint, 1)
- datetime
Nou heb ik het al wel voor elkaar gekregen om de ip-addressen die minder dan 3 keer voorkomen te selecteren:
Met deze query krijg ik dus per ip een rij terug met het aantal keer dat ie voorkomt. Dat is dus al een stap in de goede richting, maar nu wil ik nog het totaal van al deze rijen hebben. Als ik dit door middel van een while lus doe met fetch_array, dan kost dit best veel tijd. Volgensmij kan dit veel sneller my mysql dmv SUM, maar ik krijg dat niet toegepast op deze query. Wat ik heb geprobeerd is:
en nog wat meer varianten hier op die ik niet meer weet. Het ist och wel mogelijk
Weet iemand hoe ik dit voor elkaar kan krijgen met MySQL (op een snelle manier)? Of misschien zelfs zonder count op een andere manier die nog sneller is:) Snelheid is in elk geval het belangrijkst want deze query moet meerdere malen uitgevoert gaan worden. Ik heb MySQL 5.0.45.
De tabel is klein en bestaat uit:
- ip (varchar, 15)
- site (tinyint, 1)
- datetime
Nou heb ik het al wel voor elkaar gekregen om de ip-addressen die minder dan 3 keer voorkomen te selecteren:
code:
1
2
3
4
5
| SELECT COUNT( ip ) AS `totalfound` FROM `tracking` WHERE `site` = '1' GROUP BY `ip` HAVING `totalfound` < '3' |
Met deze query krijg ik dus per ip een rij terug met het aantal keer dat ie voorkomt. Dat is dus al een stap in de goede richting, maar nu wil ik nog het totaal van al deze rijen hebben. Als ik dit door middel van een while lus doe met fetch_array, dan kost dit best veel tijd. Volgensmij kan dit veel sneller my mysql dmv SUM, maar ik krijg dat niet toegepast op deze query. Wat ik heb geprobeerd is:
code:
1
2
3
4
5
| SELECT COUNT( ip ) AS `totalfound`, SUM('totalfound')
FROM `tracking`
WHERE `site` = '1'
GROUP BY `ip`
HAVING `totalfound` < '3' |
code:
1
2
3
4
5
| SELECT SUM FROM (SELECT COUNT( ip ) AS `totalfound`, SUM('totalfound')
FROM `tracking`
WHERE `site` = '1'
GROUP BY `ip`
HAVING `totalfound` < '3') |
code:
1
2
3
4
5
| SELECT COUNT( ip ), SUM(COUNT( ip )) AS `totalfound` FROM `tracking` WHERE `site` = '1' GROUP BY `ip` HAVING COUNT( ip ) < '3' |
en nog wat meer varianten hier op die ik niet meer weet. Het ist och wel mogelijk
Leef lekker in het nu, er is niks anders