Hoi mensen,
Ik heb 2 MySQL tables die gerelateerd zijn aan elkaar en waaruit ik gegevens wil weergeven. Om het probleem overzichtelijk weer te geven, geef ik hier sterk vereenvoudigde versies van de tables. De tabellen en queries bevatten dus veel meer kolommen en rijen dan hier aangegeven! Reduceren tot 1 tabel is dus niet mogelijk!
tabel usergroups:
De bedoeling? Een tabel weergeven met als kolommen de groepsnaam (usergroups.usergroup_name), en het aantal users in die groep. Alle groepen moeten worden weergegeven.
ORDER BY usergroup.usergroup_name ASC LIMIT $offset, 50
of
ORDER BY num_users DESC, usergroup.usergroup_name ASC LIMIT $offset, 50
achteraan de query (in het werkelijke ontwerp zijn het natuurlijk talrijke kolommen waarop gesorteerd moet kunnen worden). Wanneer ik met de 2 queries werk dan moet ik eigenlijk al per sorteermogelijkheid totaal verschillende queries gebruiken. Omdat de table gezien het grote aantal rijen over meerdere pagina's gespreid is (door de "LIMIT $offset, 50") wordt dit vrij complex. Veel extra code dus voor iets dat me relatief eenvoudig lijkt... Daarom dat ik het graag in 1 query wil houden.
Iemand die een helpende hand kan bieden in het opstellen van de juiste query of met zekerheid kan stellen dat het niet mogelijk is met 1 query?
Indien het gevraagde niet mogelijk is met 1 query, dan zal ik maar een kolom num_users toevoegen aan de tabel usergroups. Dat lijkt me alleszins verstandiger dan complexe en potentieel meer foutgevoelige code te schrijven...
Ik heb 2 MySQL tables die gerelateerd zijn aan elkaar en waaruit ik gegevens wil weergeven. Om het probleem overzichtelijk weer te geven, geef ik hier sterk vereenvoudigde versies van de tables. De tabellen en queries bevatten dus veel meer kolommen en rijen dan hier aangegeven! Reduceren tot 1 tabel is dus niet mogelijk!
tabel usergroups:
code:
tabel users:1
2
3
4
5
6
| | usergroup_id | usergroup_name | +--------------+----------------+ | 1 | Group1 | | 2 | Group2 | | 3 | Group3 | | 4 | Group4 | |
code:
De usergroup_id in de users tabel is gerelateerd met die in de usergroups tabel. Op deze wijze zijn users toegewezen aan een groep. Er kunnen geen users voorkomen die niet behoren tot een usergroup, maar er kunnen wel usergroups zijn die geen users bevatten.1
2
3
4
5
6
| | user_id | user_name | usergroup_id | +---------+-----------+--------------+ | 1 | Name1 | 3 | | 2 | Name2 | 1 | | 3 | Name3 | 1 | | 4 | Name4 | 2 | |
De bedoeling? Een tabel weergeven met als kolommen de groepsnaam (usergroups.usergroup_name), en het aantal users in die groep. Alle groepen moeten worden weergegeven.
code:
Wat geeft:1
2
3
4
5
6
| SELECT
usergroups.usergroup_name,
COUNT(users.user_id) AS num_users
FROM usergroups, users
WHERE usergroups.usergroup_id = users.user_group_id
GROUP BY usergroups.usergroup_id |
code:
Maar... Nu is Group4 achterwege gelaten (omdat die niet voorkomt in de users tabel). De bedoeling is echter dat groepen zonder users ook worden weergegeven (met als num_users 0 natuurlijk). Het resultaat zou er dus als volgt moeten uitzien:1
2
3
4
5
| | usergroup_name | num_users | +----------------+-----------+ | Group1 | 2 | | Group2 | 1 | | Group3 | 1 | |
code:
Ik raak er echter niet uit hoe ik dat met één query-opdracht voor elkaar krijg (als het al mogelijk is). Ik zou natuurlijk met een eerste query alle groepen kunnen opvragen en dan in een while-lus per groep het aantal users in de groep opvragen met een tweede query. Maar dan stuit ik op een ander probleem: Het is noodzakelijk dat er op elke kolom gesorteerd kan worden. Afhankelijk van de door de gebruiker gekozen instelling staat er dus nog1
2
3
4
5
6
| | usergroup_name | num_users | +----------------+-----------+ | Group1 | 2 | | Group2 | 1 | | Group3 | 1 | | Group4 | 0 | |
ORDER BY usergroup.usergroup_name ASC LIMIT $offset, 50
of
ORDER BY num_users DESC, usergroup.usergroup_name ASC LIMIT $offset, 50
achteraan de query (in het werkelijke ontwerp zijn het natuurlijk talrijke kolommen waarop gesorteerd moet kunnen worden). Wanneer ik met de 2 queries werk dan moet ik eigenlijk al per sorteermogelijkheid totaal verschillende queries gebruiken. Omdat de table gezien het grote aantal rijen over meerdere pagina's gespreid is (door de "LIMIT $offset, 50") wordt dit vrij complex. Veel extra code dus voor iets dat me relatief eenvoudig lijkt... Daarom dat ik het graag in 1 query wil houden.
Iemand die een helpende hand kan bieden in het opstellen van de juiste query of met zekerheid kan stellen dat het niet mogelijk is met 1 query?
Indien het gevraagde niet mogelijk is met 1 query, dan zal ik maar een kolom num_users toevoegen aan de tabel usergroups. Dat lijkt me alleszins verstandiger dan complexe en potentieel meer foutgevoelige code te schrijven...
A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.