• Ik zit met een probleempje en ik kan even niet zo goed bedenken hoe ik dat moet doen. Weet iemand hoe ik leden kan laten zien op een pagina die meerdere accounts op 1 IP adres hebben?Dus dat ik dan een pagina heb met de namen, maar dan alleen van degene met dubbelaccounts en niet de leden die dat niet hebben?

  • Simpele SQL-query? Moet je wel de IP-informatie hebben uiteraard:


    SQL
    SELECT ip, COUNT(ip) AS aantal
    FROM leden
    GROUP BY ip
    HAVING aantal > 1

    Ik ken de exacte tabel- en kolomnamen uiteraard niet, maar bovenstaande query dekt de lading wel lijkt mij.


    Ook zou je iets als GROUP_CONCAT(gebruikersnaam) kunnen doen, om gelijk de bijbehorende account- of gebruikersnamen weer te geven. En als je hostingprovider een soort controlepaneel heeft zit daar vaak ook iets bij als phpMyAdmin. En als je shell access hebt doe je het direct via de prompt :p.

  • Met mijn query vraag je de IP's op via welke meerdere accounts (meer dan één) geregistreerd staan. Vervolgens kun je daarbij de concrete accounts zoeken, of, zoals aangegeven, iets met GROUP_CONCAT() doen.


    Deze doet het niet, hij geeft nu 2 verschillende ip adressen aan, in plaats van dezelfde.

    Dit houdt in dat beide IP's meerdere accounts herbergen. De "aantal" kolom geeft aan hoeveel accounts onder elk IP-adres geregistreerd staan.


    Als dit aantal laag is wil dat in principe niet veel zeggen. Denk aan een huishouden of een studentenhuis, naar buiten toe hebben vaak alle, of in ieder geval meerdere, computers eenzelfde IP-adres omdat ze via hetzelfde netwerk aan het internet hangen.

  • SELECT ip FROM users where ip = data ip


    Dan tel je of er meer zijn dan 2..

    Met data ip weergeeft die alleen het ip van mijn eigen account en niet de andere accounts die ook een dubbelaccount hebben.

  • Met mijn query vraag je de IP's op via welke meerdere accounts (meer dan één) geregistreerd staan. Vervolgens kun je daarbij de concrete accounts zoeken, of, zoals aangegeven, iets met GROUP_CONCAT() doen.


    Dit houdt in dat beide IP's meerdere accounts herbergen. De "aantal" kolom geeft aan hoeveel accounts onder elk IP-adres geregistreerd staan.
    Als dit aantal laag is wil dat in principe niet veel zeggen. Denk aan een huishouden of een studentenhuis, naar buiten toe hebben vaak alle, of in ieder geval meerdere, computers eenzelfde IP-adres omdat ze via hetzelfde netwerk aan het internet hangen.

    Deze deed het helaas niet, misschien dat ik iets fout deed?


    "SELECT `rank`,`ip`,`username` FROM `leden` WHERE `username` != 'Admin' AND `dead` = '0' ORDER BY `ip` DESC LIMIT 0,30");

  • Bekijk mijn query nogmaals. Als je het principe begrijpt kun je dit omschrijven naar wat jij wilt hebben.


    SQL
    SELECT ip, COUNT(ip) AS aantal
    FROM leden

    De eerste regel bevat de kolomnamen waarin je geinteresseerd bent en een COUNT() op de IP-kolom, dit is het argument waar je op gaat groeperen. Deze sla je op als de (alias)kolom "aantal" om hier later makkelijker aan te refereren.


    De tweede regel bevat de betrokken tabel(len).


    SQL
    GROUP BY ip

    Het argument waarop je de resultaatrijen samenvoegt. Dit doe je op IP-adres.


    Code
    HAVING aantal > 1

    Hiermee geef je aan dat je alleen in de IP-adressen geinteresseerd bent die meer dan één keer voorkomen in je leden-tabel. Dit is dus een soort van filter op je resultaatset. Alle accounts met een uniek IP vallen hierdoor af uit de resultaten. Wat je overhoudt is een lijst van IP-adressen waaronder meerdere accounts (ten minste twee) geregistreerd staan.


    Omdat je groepeert op IP wordt het lastig om meer informatie in een enkele resultaatkolom te proppen omdat de resultaten al worden samengevoegd maar je zou hier bijvoorbeeld de waarden van de gebruikersnamen in op kunnen nemen door middel van GROUP_CONCAT().


    Toegepast op de informatie hierboven wordt dit dus zoiets als:

    SQL
    SELECT ip, GROUP_CONCAT(username), COUNT(ip) AS aantal
    FROM leden
    GROUP BY ip
    HAVING aantal > 1

    Wil je vervolgens meer account informatie ophoesten kun je dit het beste met een aparte query doen. Ik ging er in eerste instantie vanuit dat je vlug een overzicht wilde van mensen die zich mogelijk meerdere keren hadden geregistreerd.

  • Het hoeft ook niet perse meer info te zijn als de naam en het ip er maar op staan. Maar met jouw query krijg ik echter maar 2 accounts te zien met verschillende ip adressen terwijl er meer accounts zijn en meerdere accounts op 1 ip zijn geregistreerd. Hij werkt nog steeds niet. Het enige wat erop moet staat is de naam en het ip adres, de rest is allemaal bijzaak en hoeft eigenlijk niet als het maar correct werkt.

  • Realiseer je je dat elk IP-adres maar één keer voorkomt in de resultaatset omdat je groepeert op IP?


    Weet niet precies wat er misgaat maar als ik dit test werkt dit prima.

    De volgende query:

    SQL
    SELECT ip, GROUP_CONCAT(username), COUNT(ip) AS aantal
    FROM leden
    GROUP BY ip
    HAVING aantal > 1


    Levert precies wat ik verwacht:

    Bash
    ip		GROUP_CONCAT(username)		aantal
    127.0.0.1	Henk,Piet,Klaas			3
    127.0.0.2	Harry,Hennie			2
  • Realiseer je je dat elk IP-adres maar één keer voorkomt in de resultaatset omdat je groepeert op IP?


    Weet niet precies wat er misgaat maar als ik dit test werkt dit prima.

    De volgende query:

    SQL
    SELECT ip, GROUP_CONCAT(username), COUNT(ip) AS aantal
    FROM leden
    GROUP BY ip
    HAVING aantal > 1

    Levert precies wat ik verwacht:

    Bash
    ip		GROUP_CONCAT(username)		aantal
    127.0.0.1	Henk,Piet,Klaas			3
    127.0.0.2	Harry,Hennie			2

    Ik snap het nu inderdaad wel. Maar hoe krijg ik dan de juiste namen bij het IP adres? Want nu krijg ik maar één naam daar te staan en niet 2 of 3 zoals jij het hebt. Maar dan heb ik wel SELECT naam,ip gedaan om die naam daar zichtbaar te maken. Hoe doe jij dat dan, want anders heb ik daar geen naam staan?

  • Dat is het "nadeel" van het groeperen: je groepeert meerdere account-records op basis van IP. Het is dan redelijk willekeurig welke (enkele) naam wordt getoond in een resultaatrij. Daarom gebruik je GROUP_CONCAT(). Deze trekt de namen van meerdere kolommen samen in één rij.


    Zoals ik al aangaf, een alternatief is dat je, uitgaande van die IP's een nieuwe query (of subquery) bakt waarin je die records dus wel apart (in meerdere rijen) opvraagt.


    Maar dan nog, als je deze informatie vervolgens toont op een scherm dan zul je deze IP's toch op een of andere manier "grafisch" moeten groeperen, door tijdens het uitlezen bij te houden welke accounts -op basis van IP- bij elkaar horen.


    Misschien heb je iets aan het volgende, voortbordurend op het vorige voorbeeld:


    En als dit allemaal abracadabra is, dan loont het misschien de moeite om je ofwel wat meer te verdiepen in de materie, of een programmeur in te huren/aan te nemen.

  • Het is toch gelukt. GROUP_CONCAT(username) moest zijn GROUP_CONCAT(username) AS gebruikersnaam. Net zoals die IP. Evengoed bedankt voor de hulp. Hier kan een slotje op.

Participate now!

Heb je nog geen account? Registreer je nu en word deel van onze community!