[PHP] sorteren op een item in een array

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Uit de Active Directory haal ik met een query alle users van een bepaalde groep. Met de username die ik terugkrijg query ik vervolgens om te kijken of die user voorkomt en hoe vaak.

Omdat ik per user een losse query doe kan ik de data die ik krijg dus niet sorteren. Dit heb ik opgelost (denk ik) door ze in een array te stoppen. Hier heb ik naar gezocht en kwam uit op het volgende:
PHP:
1
$array[] = array ('Naam' => $displayname_ldap, 'Gebruikersnaam' => $loginname_ldap, 'Logins' => $row['teller']);

Vervolgens kan ik met print_r zien dat iedereen in mijn array is gestopt en een volgnummer heeft gekregen in de array.

Is het vervolgens mogelijk om door PHP de array te laten sorteren op bijvoorbeeld de array waarde "Logins" ?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Waarom haal je niet eerste alle users op uit AD, om vervolgens één query te doen om alle users uit je DB op te halen? Met creatief spelen met implode en een IN-constructie in je query kom je er toch wel? :? Ik denk dat het handiger is om de oorzaak van je probleem op te lossen dan je daadwerkelijke vraag.

Het antwoord op je vraag zou overigens deze functie zijn. Maar nogmaals, dat is symptoombestrijding als je het mij vraagt.

[ Voor 38% gewijzigd door NMe op 09-06-2009 15:32 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Dat doe ik ook, alleen ik doe per user een query op MySQL. Er is voor deze volgorde gekozen zodat er ook users tussen zitten die nooit ingelogd zijn geweest.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
      $result=$adldap->group_members('Groep_naam');
    
      foreach ($result as $value) {

    

            $result = mysql_query("sql query")   or die(mysql_error());
            while($row = mysql_fetch_array( $result )) {
                
             //array maken

            }


    }

[ Voor 48% gewijzigd door ViNyL op 09-06-2009 15:37 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-09 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Een beetje meer zoekwerk mocht ook wel
ViNyL schreef op dinsdag 09 juni 2009 @ 15:28:
Is het vervolgens mogelijk om door PHP de array te laten sorteren op bijvoorbeeld de array waarde "Logins" ?
http://nl3.php.net/usort
.edit: ah dat zei NMe al, even overheen gelezen :)

[ Voor 8% gewijzigd door .oisyn op 09-06-2009 15:49 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • flashin
  • Registratie: Augustus 2002
  • Laatst online: 17-12-2023
En kun je dat echt niet beter oplossen? Het klinkt nou niet echt als een case geniaal-je-database performance-optimaliseren.

Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Het probleem is dat in de groep in de AD users zitten die niet per se in de database staan, maar wel op de lijst moeten komen. Als ze niet in de database zijn ze niet ingelogd geweest.

Het is dus of alleen de mensen uit de de database halen die wel zijn ingelogd en vervolgens de gene zonder login toevoegen maar dan moet je nog iets gaan vergelijken als ik me niet vergis.

Als iemand een suggestie heeft, ik zie zo geen andere oplossing..

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:15

Janoz

Moderator Devschuur®

!litemod

Vergelijken is geen probleem, daar zijn computers heel goed in. Komop, zo moeilijk is een leuk algorithme uitdenken nu ook weer niet.

Als je aan de ene kant een gesorteerde lijst van namen hebt en je hebt aan de andere kant een lijst met gesorteerde namen, dan moet het toch redelijk straight forward zijn om door die twee lijsten te lopen en de gegevens samen te voegen?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

ViNyL schreef op dinsdag 09 juni 2009 @ 16:02:
Het probleem is dat in de groep in de AD users zitten die niet per se in de database staan, maar wel op de lijst moeten komen. Als ze niet in de database zijn ze niet ingelogd geweest.

Het is dus of alleen de mensen uit de de database halen die wel zijn ingelogd en vervolgens de gene zonder login toevoegen maar dan moet je nog iets gaan vergelijken als ik me niet vergis.

Als iemand een suggestie heeft, ik zie zo geen andere oplossing..
Ik zeg het toch al in mijn eerste post hierboven? Haal alle gebruikernamen op in een array, laten we zeggen dat die in de array $users zitten.
PHP:
1
$query = "SELECT * FROM Users WHERE UserName IN ('".implode("','", $users)."')";

Eventueel met de nodige joins e.d.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Maar je kan toch niet slechts 1 query doen om voor alle users de data op te halen? Dan kom je toch nog op een losse query per user? Of mis ik iets...?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:15

Janoz

Moderator Devschuur®

!litemod

ViNyL schreef op woensdag 10 juni 2009 @ 10:53:
Maar je kan toch niet slechts 1 query doen om voor alle users de data op te halen? Dan kom je toch nog op een losse query per user? Of mis ik iets...?
Waarom niet?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Nou omdat je een query doet met WHERE dat is toch specifiek voor die query?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:15

Janoz

Moderator Devschuur®

!litemod

Een query kan gewoon meerdere resultaten opleveren. Ik snap niet wat je probleem is eigenlijk.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 18:53

remco_k

een cassettebandje was genoeg

ViNyL schreef op woensdag 10 juni 2009 @ 11:03:
Nou omdat je een query doet met WHERE dat is toch specifiek voor die query?
Ja.
Maar afhankelijk van de WHERE voorwaarde(n) kunnen er ook meerdere records uitkomen, in plaats van 1.

Deze query:
code:
1
SELECT * FROM Users WHERE UserName IN ('ViNyL','remco_k','Janoz');

Zal 3 records terug geven, zolang we maar alledrie in die tabel staan.

Alles kan stuk.


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Janoz schreef op woensdag 10 juni 2009 @ 11:07:
Een query kan gewoon meerdere resultaten opleveren. Ik snap niet wat je probleem is eigenlijk.
Ja dat snap ik, alleen dan behoudt ik dus gewoon mijn huidige situate:

1. query alle users in de Active Directory.
2. doe per user een query in de MySQL database
3. zet output op scherm

Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
remco_k schreef op woensdag 10 juni 2009 @ 11:08:
[...]

Ja.
Maar afhankelijk van de WHERE voorwaarde(n) kunnen er ook meerdere records uitkomen, in plaats van 1.

Deze query:
code:
1
SELECT * FROM Users WHERE UserName IN ('ViNyL','remco_k','Janoz');

Zal 3 records terug geven, zolang we maar alledrie in die tabel staan.
Ah kijk, op die fahrrad!

Acties:
  • 0 Henk 'm!

  • .Johnny
  • Registratie: September 2002
  • Laatst online: 04-07 11:10
ViNyL schreef op woensdag 10 juni 2009 @ 11:39:
[...]


Ja dat snap ik, alleen dan behoudt ik dus gewoon mijn huidige situate:

1. query alle users in de Active Directory.
2. doe per user een query in de MySQL database
3. zet output op scherm
Nee, je snapt het nog niet helemaal :-) want het alternatief is:
1. query alle users in de AD
2. query alle users in 1 query op mysql
3. zet de output op scherm.

het alternatief hoeft niet voor elke user een nieuwe query te doen. is veel minder resource intensief. en netter.

--edit; ah, je hebt em.

Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
.Johnny schreef op woensdag 10 juni 2009 @ 11:42:
[...]

Nee, je snapt het nog niet helemaal :-) want het alternatief is:
1. query alle users in de AD
2. query alle users in 1 query op mysql
3. zet de output op scherm.

het alternatief hoeft niet voor elke user een nieuwe query te doen. is veel minder resource intensief. en netter.

--edit; ah, je hebt em.
Ja het kwartje was ondertussen gevallen.

Het enige wat ik nog even moet uitzoeken is dat ik ook wil tellen hoe vaak de username voorkomt in de database binnen een datum selectie. Dit zijn het aantal login sessies die iemand gedaan heeft.
Mijn huidige (nieuwe) query laat uiteindelijk maar een persoon zien terwijl er meerdere zijn..

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 SELECT * , COUNT( `username` ) AS teller
FROM inlogdata
WHERE username
IN (
'user1', 'user2', 'user3'
)
AND datum
BETWEEN (
'2009-06-01'
)
AND (
'2009-06-09'
)
LIMIT 0 , 30

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-09 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je moet een GROUP BY username doen. En dan een COUNT doen op een andere kolom.

[ Voor 38% gewijzigd door .oisyn op 10-06-2009 11:50 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 18:53

remco_k

een cassettebandje was genoeg

En vooral ook de Limit weglaten.

Alles kan stuk.


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
.oisyn schreef op woensdag 10 juni 2009 @ 11:49:
Je moet een GROUP BY username doen. En dan een COUNT doen op een andere kolom.
Like this:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT username,COUNT( `username` ) FROM inlogdata
WHERE username
IN (
'user1', 'user2', 'user3'
)
AND datum
BETWEEN (
'2009-06-01'
)
AND (
'2009-06-09'
) GROUP BY username


De LIMIT komt door mijn knip en plak uit phpMyAdmin :)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-09 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik zei nog meer dan 1 zin hoor :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Heh? Je reactie hierboven was toch alleen dit?
Je moet een GROUP BY username doen. En dan een COUNT doen op een andere kolom.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-09 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ja. Dat zijn twee zinnen. Jij hebt alleen de eerste zin toegepast, want je doet nog steeds een COUNT op username, wat natuurlijk niet gaat werken :)

[ Voor 37% gewijzigd door .oisyn op 10-06-2009 12:40 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
De count zit er toch in? Ook in mijn reactie op je post :)

Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
ViNyL schreef op woensdag 10 juni 2009 @ 12:40:
De count zit er toch in? Ook in mijn reactie op je post :)
.oisyn schreef op woensdag 10 juni 2009 @ 12:39:
(...) je doet nog steeds een COUNT op username, wat natuurlijk niet gaat werken :)

Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Is er nog een makkelijke manier om de users uit de array in een keer in de query te krijgen?

Dus: 'user1','user2' etc?

Ik zit te denken aan een foreach loop om deze string op te maken..

Zo dus:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
            $total = 0;

            foreach ($result as $value) {
                $total = $total + 1;
            }
            
            $users = '';
            $i = 1;
            foreach ($result as $value) {
                if ($i < $total) {
                    $users .= "'". $value . "',";
                } else if ($i == $total) {
                    $users .= "'". $value . "'";        
                }
                $i++;
            }

[ Voor 47% gewijzigd door ViNyL op 10-06-2009 13:21 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

ViNyL schreef op woensdag 10 juni 2009 @ 11:39:
[...]


Ah kijk, op die fahrrad!
ViNyL schreef op woensdag 10 juni 2009 @ 13:10:
Is er nog een makkelijke manier om de users uit de array in een keer in de query te krijgen?

Dus: 'user1','user2' etc?

Ik zit te denken aan een foreach loop om deze string op te maken..
Lees jij mijn posts überhaupt? :/ Beide dingen waar deze twee posts over gaan had ik in mijn laatste post in dit topic al beantwoord.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Oh crap ziet het ja :)

Beetje te hyperactive omdat het werkt :D

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Niet om lullig te doen, maar als je iets vraagt, heb dan op zijn minst het respect om alles ook door te lezen. Dit komt heel vervelend over, en mijn post is niet de enige waarbij je dat doet in dit topic. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Het heeft er niet zo zeer mee te maken dat ik het niet lees, maar soms verspringt mijn focus nog al eens op een bepaalde post. Beetje ADHD he.. my mistake.

Overigens doe ik met deze query precies wat ik eigenlijk niet wil, de mensen weglaten die nooit ingelogd zijn geweest.. Is daar nog een andere manier voor? Zodat deze er wel in staan?

In $users zitten alle mensen: 'user1','user2' etc

Als user2 nu niet voorkomt staat hij dus niet op de lijst..

PHP:
1
SELECT fullname,username,COUNT( `username` ) AS teller FROM inlogdata WHERE username IN ($users) AND datum BETWEEN ('$van') AND ('$tot') GROUP BY username ORDER BY teller DESC

[ Voor 61% gewijzigd door ViNyL op 10-06-2009 15:42 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:15

Janoz

Moderator Devschuur®

!litemod

Beetje nabewerking op je resultaat. Hoe dat moet staat al hier : Janoz in "[PHP] sorteren op een item in een array"

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Het is me duidelijk.. Dank allen!

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-09 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom doe je nou nog steeds de COUNT(username)?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Waarschijnlijk omdat MySQL alles slikt en daar niet op gaat bokken. Nog steeds fout uiteraard. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • winkbrace
  • Registratie: Augustus 2008
  • Laatst online: 24-08 15:17
Overigens kan ik me haast niet voorstellen dat de lijst van alle mogelijke gebruikers niet ook gewoon ergens in de database van TS zal staan waarmee hij gewoon met een OUTER JOIN in 1 query al het gevraagde kan oplepelen ;)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-09 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

NMe schreef op woensdag 10 juni 2009 @ 18:05:
Waarschijnlijk omdat MySQL alles slikt en daar niet op gaat bokken. Nog steeds fout uiteraard. :)
Nou weet ik niet direct hoe je "nog steeds fout" precies bedoelt, maar zelfs MySQL geeft volgens mij nu niet het resultaat dat ie wilt hebben.

.edit: ah, dat doet ie dus wel 8)7

[ Voor 5% gewijzigd door .oisyn op 10-06-2009 19:02 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

.oisyn schreef op woensdag 10 juni 2009 @ 19:00:
[...]

.edit: ah, dat doet ie dus wel 8)7
Dat zeg ik. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
BazzPsychoNut schreef op woensdag 10 juni 2009 @ 18:14:
Overigens kan ik me haast niet voorstellen dat de lijst van alle mogelijke gebruikers niet ook gewoon ergens in de database van TS zal staan waarmee hij gewoon met een OUTER JOIN in 1 query al het gevraagde kan oplepelen ;)
De volledige lijst staat niet in de database. Wel in de Active Directory. Daardoor kan ik niet in een keer alle users ophalen uit de database.
.oisyn schreef op woensdag 10 juni 2009 @ 16:16:
Waarom doe je nou nog steeds de COUNT(username)?
Dat is toch de enige manier om op te halen hoevaak de user in totaal is ingelogd? De user kan op 1 dag namelijk vaker ingelogd zijn. Die wil ik allemaal bij elkaar op tellen.
NMe schreef op woensdag 10 juni 2009 @ 18:05:
Waarschijnlijk omdat MySQL alles slikt en daar niet op gaat bokken. Nog steeds fout uiteraard. :)
Ik hoor graag wat er nog fout is aan mijn query natuurlijk. Ben nog niet heel erg thuis in de uitgebreidere queries!

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

ViNyL schreef op donderdag 11 juni 2009 @ 08:25:
[...]

Ik hoor graag wat er nog fout is aan mijn query natuurlijk.
.oisyn heeft het nou al twee keer gezegd en ik heb niet echt de behoefte dat te gaan herhalen. ;) In plaats daarvan maar een linkje. ;)
Programming FAQ - SQL: Hoe werkt dat GROUP BY nu eigenlijk?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Hmm je reactie snap ik niet. Kun je het verschil uitleggen dan?

zoals ik al aangaf is de count nodig voor het aantal malen dat iemand voorkomt. Wat de GROUP BY doet is iedere user tonen (identieke resultaten te groeperen). Als ik GROUP BY weglaat toont hij er slechts 1...

[ Voor 7% gewijzigd door ViNyL op 11-06-2009 11:30 ]


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Het is al x keer gezegd, maar wat .oisyn bedoelt is dat je niet username in je GROUP BY kunt hebben, en vervolgens een COUNT(username) kunt toevoegen. Die COUNT() moet dan op een andere kolom :)

Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Kijk daar kan ik wat mee. Er wordt wel verteld dat ik wat fout doe en verwezen naar allerlei FAQ maar niet WAT ik fout doe.

Overigens krijg ik exact hetzelfde resultaat als ik de COUNT laat lopen op bijvoorbeeld de username kolom of op de datum kolom..

[ Voor 34% gewijzigd door ViNyL op 11-06-2009 11:37 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:15

Janoz

Moderator Devschuur®

!litemod

ViNyL schreef op donderdag 11 juni 2009 @ 11:35:
Kijk daar kan ik wat mee. Er wordt wel verteld dat ik wat fout doe en verwezen naar allerlei FAQ maar niet WAT ik fout doe.
Sorry, maar nu zakt mijn broek een beetje af. Op wat voor manier verteld .oisyn je niet wat er fout is in deze reactie?
.oisyn schreef op woensdag 10 juni 2009 @ 11:49:
Je moet een GROUP BY username doen. En dan een COUNT doen op een andere kolom.
Op wat voor manier is de zin 'een count doen op een andere kolom' niet duidelijk? Ik raad je aan eerst eens wat beter de reacties te leren lezen voordat je mensen gaat lopen betichten van het niet goed uitleggen wat je fout doet...

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Volgens mij geeft .oisyn hier zelf aan dat ie het ook niet snapt toch?
Nou weet ik niet direct hoe je "nog steeds fout" precies bedoelt, maar zelfs MySQL geeft volgens mij nu niet het resultaat dat ie wilt hebben.
Zoals ik net zeg, of ik de COUNT nu op de username doe of op het datum veld; het resultaat is hetzelfde. Ik snap dus niet wat daar fout aan is.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-09 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Overigens begin ik te twijfelen aan de juistheid van mijn opmerking... Stel een tabel heeft maar 1 kolom, namelijk de username. Hoe kom je dan te weten hoe vaak elke username in de tabel staat, met een COUNT(*) ... GROUP BY username oid?
ViNyL schreef op donderdag 11 juni 2009 @ 11:41:
Zoals ik net zeg, of ik de COUNT nu op de username doe of op het datum veld; het resultaat is hetzelfde. Ik snap dus niet wat daar fout aan is.
Dat het resultaat in MySQL hetzelfde is wil nog niet zeggen dat het goede SQL is. MySQL laat wel meer dingen toe die niet kloppen. Beter leer je het gewoon juist aan.

[ Voor 121% gewijzigd door .oisyn op 11-06-2009 11:50 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
.oisyn schreef op donderdag 11 juni 2009 @ 11:42:
Overigens begin ik te twijfelen aan de juistheid van mijn opmerking... Stel een tabel heeft maar 1 kolom, namelijk de username. Hoe kom je dan te weten hoe vaak elke username in de tabel staat, met een COUNT(*) ... GROUP BY username oid?


[...]

Dat het resultaat in MySQL hetzelfde is wil nog niet zeggen dat het goede SQL is. MySQL laat wel meer dingen toe die niet kloppen. Beter leer je het gewoon juist aan.
Volgens mij (wat ik nu dus doe) is door de username/datum te tellen en te groeperen op de username. Het laat iig wel het resultaat zien wat ik zoek.. Mijn tabel heeft dus meer dan 1 kolom.

Met slecht een kolom lijkt het me een kwestie van username tellen en ook group by doen?

Daarom weet ik dus niet wat er nu fout is aan de query. Ik heb je opmerkingen dus wel degelijk toegepast en niet zoals hier boven gesugereerd wordt, links laten liggen...
Dat het resultaat in MySQL hetzelfde is wil nog niet zeggen dat het goede SQL is. MySQL laat wel meer dingen toe die niet kloppen. Beter leer je het gewoon juist aan.
Daar ben ik het natuurlijk helemaal mee eens :)

[ Voor 17% gewijzigd door ViNyL op 11-06-2009 11:47 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:15

Janoz

Moderator Devschuur®

!litemod

Ik zou zeggen, print dit topic eens helemaal uit. Zoek een rustig plekje op en ga het topic eens aandachtig van begin tot einde doorlezen. Waar je dan even op moet letten is op welke momenten je tips en informatie krijgt, op welke momenten je daadwerkelijk daar wat mee doet en vooral ook op welke momenten je feedback geeft over de aangeleverde informatie en hoe je dat toegepast hebt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-09 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waar het om gaat is dat je met GROUP BY allerlei rijen bij wijze van spreken "samenperst" - een username wordt immers maar 1 keer geretourneerd, maar daaronder vallen wel meerdere rijen die die username hebben. Met een zogenaamde aggregate function kun je een bewerking loslaten op die rijen. Zo zal MAX(kolom) de maximale waarde van kolom uit die rijen teruggeven. COUNT(kolom) telt het aantal rijen die kolom heeft opgeleverd. Het is onzinnig om zo'n aggregate function op een kolom toe te passen waar je ook op groepeert - die kolom is immers al uniek voor die specifieke groep. Feitelijk vraag je nu dus het aantal unieke usernames, alleen MySQL interpreteert die vraag verkeerd en geeft toevallig precies terug wat je wel wilt weten, namelijk hoe vaak elke username voorkomt.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

.oisyn schreef op donderdag 11 juni 2009 @ 11:42:
Overigens begin ik te twijfelen aan de juistheid van mijn opmerking... Stel een tabel heeft maar 1 kolom, namelijk de username. Hoe kom je dan te weten hoe vaak elke username in de tabel staat, met een COUNT(*) ... GROUP BY username oid?
Net even in MSSQL uitgeprobeerd:
SQL:
1
SELECT COUNT(Email) FROM [User] GROUP BY Email

Geeft netjes de rijen terug die ik wil, dus blijkbaar is het goeie SQL. :o

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
@ .oisyn: de uitleg is me helemaal helder, blijkbaar werkt de query dus wel (ook in MSSQL) zoals ook NMe aangeeft maar is ie toch niet helemaal correct. Interpreteert ook MsSQL dit verkeerd dan?

Als ik nu delen van mijn query weglaat kan ik zien wat ieder stukje doet en als ik
code:
1
2
 SELECT username, COUNT( 'username' )
FROM `inlogdata`


Krijg ik slechts 1 user terug. Voeg ik er GROUP BY aan toe, dan komen wel alle users naar boven. Is er nog een andere manier om dat te doen dan?

[ Voor 6% gewijzigd door ViNyL op 11-06-2009 11:59 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Zoals je in de link die ik hierboven gaf kan lezen kun je geen aggregate functions (waaronder COUNT) gebruiken als je geen GROUP BY hebt. Dát is wel iets dat MySQL verkeerd toepast en in geen enkel ander DBMS gaat werken. Immers: hoe weet je database wélke user je terug wil krijgen in combinatie met die count?

Verder geloof ik niet dat ik je vraag helemaal begrijp. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 18:53

remco_k

een cassettebandje was genoeg

Even voor de duidelijkheid, de syntax van
PHP:
1
2
SELECT fullname,username,COUNT( `username` ) AS teller FROM inlogdata
group by fullname,username

Is gewoon goed. Sterker nog, in deze vraagstelling maakt het *NIETS* uit wat je in de parameter van COUNT zet. Dat gaat in deze pas uitmaken als je bij deze parameter b.v. het DISTINCT keyword gaat gebruiken.

Dit mag dus net zo goed:
PHP:
1
2
SELECT fullname,username,COUNT( * ) AS teller FROM inlogdata
group by fullname,username

En op de plek van het * mag ook elke andere willekeurige kolom staan.

De vraag is alleen, of dit nou de resultset oplevert die ViNyL wil hebben.

Alles kan stuk.

Pagina: 1