Mysql having
Ik ben wat aan het experimenteren met having..
Ik ben bezig met een scriptje die accounts geregistreerd onder dezelfde E-mail of IP weergeeft. Ik gebruik dit script om spammers en dubbele accounts te controleren. Ik besef ook dat dit geen betrouwbare manier is, maar laat ons zeggen dat we zo toch een kleine controle achter de hand hebben, als er iets verdacht gebeurt tussen 2 gebruikers.
Maar ik kan nu niet meer verder om de gebruikers met hetzelfde IP weer te geven.
Hetvolgende had ik al geprobeerd:
De dubele IP's worden weergegeven, maar hoe geef ik nu de gebruikers die onder deze IP's geregistreerd zijn weer?
Hoe kan ik nu verder?
Ik ben bezig met een scriptje die accounts geregistreerd onder dezelfde E-mail of IP weergeeft. Ik gebruik dit script om spammers en dubbele accounts te controleren. Ik besef ook dat dit geen betrouwbare manier is, maar laat ons zeggen dat we zo toch een kleine controle achter de hand hebben, als er iets verdacht gebeurt tussen 2 gebruikers.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?
$query = "SELECT ip, count(ip)
FROM gebruikers
GROUP BY ip
HAVING count(ip) > 1";
$result = mysql_query($query) or die(mysql_error());
?>
$query = "SELECT ip, count(ip)
FROM gebruikers
GROUP BY ip
HAVING count(ip) > 1";
$result = mysql_query($query) or die(mysql_error());
?>
Maar ik kan nu niet meer verder om de gebruikers met hetzelfde IP weer te geven.
Hetvolgende had ik al geprobeerd:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?
while($row = mysql_fetch_object($result)){
echo "
<td align=center>$row->name</td>
<td align=center>$row->ip</td>
<td align=center>Notities</td>";
}
?>
while($row = mysql_fetch_object($result)){
echo "
<td align=center>$row->name</td>
<td align=center>$row->ip</td>
<td align=center>Notities</td>";
}
?>
De dubele IP's worden weergegeven, maar hoe geef ik nu de gebruikers die onder deze IP's geregistreerd zijn weer?
Hoe kan ik nu verder?
Gewijzigd op 01/01/1970 01:00:00 door Jens
Weet je zeker dat de data in je database klopt? Met de query is immers niet zoveel mis, zie dit voorbeeldje:
Verder zou je natuurlijk de query gewoon eens in phpMyAdmin oid kunnen uitvoeren, dan weet je of het aan de query of aan je PHP script ligt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
mysql> SELECT * FROM ipadres;
+----+-----------------+
| id | ip |
+----+-----------------+
| 1 | 127.0.0.1 |
| 2 | 127.0.0.1 |
| 3 | 123.123.123.123 |
| 4 | 123.456.123.456 |
| 5 | 123.123.123.123 |
| 6 | 123.456.456.123 |
| 7 | 1.1.1.1 |
| 8 | 1.1.1.1 |
+----+-----------------+
8 rows in set (0.00 sec)
mysql> SELECT ip, COUNT(ip) AS aantal
-> FROM ipadres
-> GROUP BY ip HAVING COUNT(ip) > 1;
+-----------------+--------+
| ip | aantal |
+-----------------+--------+
| 1.1.1.1 | 2 |
| 123.123.123.123 | 2 |
| 127.0.0.1 | 2 |
+-----------------+--------+
3 rows in set (0.00 sec)
+----+-----------------+
| id | ip |
+----+-----------------+
| 1 | 127.0.0.1 |
| 2 | 127.0.0.1 |
| 3 | 123.123.123.123 |
| 4 | 123.456.123.456 |
| 5 | 123.123.123.123 |
| 6 | 123.456.456.123 |
| 7 | 1.1.1.1 |
| 8 | 1.1.1.1 |
+----+-----------------+
8 rows in set (0.00 sec)
mysql> SELECT ip, COUNT(ip) AS aantal
-> FROM ipadres
-> GROUP BY ip HAVING COUNT(ip) > 1;
+-----------------+--------+
| ip | aantal |
+-----------------+--------+
| 1.1.1.1 | 2 |
| 123.123.123.123 | 2 |
| 127.0.0.1 | 2 |
+-----------------+--------+
3 rows in set (0.00 sec)
Verder zou je natuurlijk de query gewoon eens in phpMyAdmin oid kunnen uitvoeren, dan weet je of het aan de query of aan je PHP script ligt.
De data in de database klopt, hij geeft immers de IP-adressen correct weer.
Maar ik zou ook graag de gebruikers die bij dat IP-adres horen erbij zetten.
Dit geeft een error..
Maar ik zou ook graag de gebruikers die bij dat IP-adres horen erbij zetten.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?
$query = "SELECT ip,name count(ip)
FROM gebruikers
GROUP BY ip
HAVING count(ip) > 1";
?>
$query = "SELECT ip,name count(ip)
FROM gebruikers
GROUP BY ip
HAVING count(ip) > 1";
?>
Dit geeft een error..
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?
$query = "SELECT ip,name, count(ip)
FROM gebruikers
GROUP BY ip
HAVING count(ip) > 1";
?>
$query = "SELECT ip,name, count(ip)
FROM gebruikers
GROUP BY ip
HAVING count(ip) > 1";
?>
De naam wordt een grote gok trouwens. Het werkt wel maar het is beter om de naam in een apperte query op te halen.
Edit:
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
@ Martijn: De eerste oplossing die je voorstelde werkte, er werd namelijk een naam weergegeven. Helaas was dit maar van 1 van de x aantal personen die onder dat IP geregistreerd zijn. Hoe kan ik ALLE namen onder een bepaald IP wergeven?
Je 2de oplossing geeft niets weer.
Je 2de oplossing geeft niets weer.
@Martijn: de eerste query die je geeft is ongeldig en zal in elke goede database gewoon een foutmelding opleveren. Je mist namelijk de 'name' kolom in je GROUP BY clausule.
Je tweede query is dus de enige correcte ;-)
Je tweede query is dus de enige correcte ;-)
@Blanche:
Er staat toch ook onder dat de query niet goed is ;P
Er staat toch ook onder dat de query niet goed is ;P
Maar de 2de query werkt niet..
Quote:
Hoe kan ik ALLE namen onder een bepaald IP wergeven?
Je 2de oplossing geeft niets weer.
Je 2de oplossing geeft niets weer.
Dat zou ik "GROUP BY ..." en "HAVING ..." verwijderen.
zo?:
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
Quote:
Dan wil je dus niet groeperen op de combinatie van naam en ipadres, dat zal dan elke keer verschillen...Hoe kan ik ALLE namen onder een bepaald IP wergeven?
Probeer het eens zo:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
SELECT
ip,
naam
FROM
tabel
WHERE
ip IN (
SELECT ip
FROM tabel
GROUP BY ip
HAVING COUNT(ip) > 1
)
ip,
naam
FROM
tabel
WHERE
ip IN (
SELECT ip
FROM tabel
GROUP BY ip
HAVING COUNT(ip) > 1
)
Deze query geeft dus de combinatie van naam en ip terug van ipadressen die meer dan 1x voorkomen in de database.
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'gebruikers WHERE ip IN (SELECT ip FROM gebruikers GROUP BY ip HAVING COUNT(ip) > 1)' at line 1
Ik heb de query van Blanche getest, het werkt.
Heb je misschien een oude MySQL? versie 4 ?
Heb je misschien een oude MySQL? versie 4 ?
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
Vreemd, ik zie niet direct een fout in bovenstaande query. Probeer hem anders eerst eens uit te voeren in phpMyAdmin oid...
Vreemd, met domme backticks rond de tabelnaam werkt het wel..
Bedankt voor jullie hulp!
Bedankt voor jullie hulp!
Gewijzigd op 01/01/1970 01:00:00 door Jens




