Consultes SQL – LAN Party Intranet

📊 Consultes SQL – Extracció d’Informació

Intranet LAN Party · Base de Dades SQLite · 12 consultes amb evidències

Febrer 2026

🎯 Resum de tècniques SQL implementades

JOINsINNER JOIN, LEFT JOIN, fins a 4 JOINs en una sola consulta
AgregaciónCOUNT, SUM, MIN, MAX, COUNT(DISTINCT)
FiltratGROUP BY, HAVING, WHERE amb condicions complexes
SubqueriesSubqueries correlades dins SELECT i WHERE
FuncionsCOALESCE, ROUND, CASE WHEN, GROUP_CONCAT
Evidències12 consultes amb resultats reals de la BBDD
📊

C1 – Usuaris amb el nom del rol assignat

ÀREA 1 – USUARIS I ROLS
📝 Justificació: Necessitem veure en una sola taula qui és cada usuari i quines funcions té dins del sistema. Utilitzem un INNER JOIN entre usuaris i rols perquè cada usuari té exactament un rol (FK obligatòria). Ordenem per rol per agrupar visuament admins, jugadors i espectadors.
Tècniques SQL: INNER JOINWHEREORDER BY
🖥️ Consulta:
SELECT u.id_usuari, u.nom, u.nick_joc, u.email,
                  r.nom_rol, r.descripcio AS descripcio_rol
           FROM usuaris u
           INNER JOIN rols r ON u.id_rol = r.id_rol
           WHERE u.actiu = 1
           ORDER BY r.id_rol ASC, u.nom ASC;
📋 Resultats (10 files):
id_usuarinomnick_jocemailnom_roldescripcio_rol
9Albert ComaAlbertAcealbert.coma@gmail.comadminAdministrador amb control total del sistema
5Dani SolàDaniStardani.sola@gmail.comjugadorUsuari que pot inscriure's i participar en tornejos
7Gerard FontGerardGGgerard.font@yahoo.comjugadorUsuari que pot inscriure's i participar en tornejos
3Jordi PuigJordiXjordi.puig@yahoo.comjugadorUsuari que pot inscriure's i participar en tornejos
6Laia VallsLaiaMasterlaia.valls@gmail.comjugadorUsuari que pot inscriure's i participar en tornejos
1Marc LópezMarcL_Promarc.lopez@gmail.comjugadorUsuari que pot inscriure's i participar en tornejos
8Neus CampsNeusFPSneus.camps@hotmail.comjugadorUsuari que pot inscriure's i participar en tornejos
4Paula RocaPaulaRockpaula.roca@hotmail.comjugadorUsuari que pot inscriure's i participar en tornejos
2Sara MartínezSaraGamersara.martinez@gmail.comjugadorUsuari que pot inscriure's i participar en tornejos
10Rita MasRitaPlayrita.mas@yahoo.comespectadorUsuari que només pot veure contingut i fer xat
📊

C2 – Nombre d'usuaris per cada rol

ÀREA 1 – USUARIS I ROLS
📝 Justificació: Ens permet saber la distribució de rols dins del sistema: quants admins tenim, quants jugadors actius i espectadors. Molt útil per a l’administrador per controlar el balanç de la comunitat. Utilitzem GROUP BY amb COUNT i LEFT JOIN per incloure rols sense usuaris.
Tècniques SQL: LEFT JOINGROUP BYCOUNTORDER BY
🖥️ Consulta:
SELECT r.nom_rol, r.descripcio,
                  COUNT(u.id_usuari) AS total_usuaris
           FROM rols r
           LEFT JOIN usuaris u ON r.id_rol = u.id_rol AND u.actiu = 1
           GROUP BY r.id_rol, r.nom_rol, r.descripcio
           ORDER BY total_usuaris DESC;
📋 Resultats (3 files):
nom_roldescripciototal_usuaris
jugadorUsuari que pot inscriure's i participar en tornejos8
adminAdministrador amb control total del sistema1
espectadorUsuari que només pot veure contingut i fer xat1
📊

C3 – Usuaris inscrits amb estat de pagament

ÀREA 2 – INSCRIPCIONS
📝 Justificació: L’organitzador necessita saber qui s’ha inscrit a cada poble i si ha pagat la entrada. Utilitzem un doble JOIN (inscripcions → usuaris, inscripcions → lan_party) i CASE WHEN per convertir els valors booleens (0/1) en texto llegible (‘Sí’/’No’).
Tècniques SQL: INNER JOIN (x2)CASE WHENORDER BY
🖥️ Consulta:
SELECT lp.nom_événiment, u.nick_joc, u.nom,
                  CASE WHEN i.ha_pagat = 1 THEN 'Sí' ELSE 'No' END AS ha_pagat,
                  CASE WHEN i.ha_assistit = 1 THEN 'Sí' ELSE 'No' END AS ha_assistit,
                  i.data_inscripcio
           FROM inscripcions i
           INNER JOIN usuaris u ON i.id_usuari = u.id_usuari
           INNER JOIN lan_party lp ON i.id_lan_party = lp.id_lan_party
           ORDER BY lp.id_lan_party ASC, i.ha_pagat DESC, u.nom ASC;
📋 Resultats (13 files):
nom_événimentnick_jocnomha_pagatha_assistitdata_inscripcio
LAN Party Hivern 2026DaniStarDani Solà2026-02-03 12:46:33
LAN Party Hivern 2026GerardGGGerard FontNo2026-02-03 12:46:33
LAN Party Hivern 2026JordiXJordi PuigNo2026-02-03 12:46:33
LAN Party Hivern 2026LaiaMasterLaia Valls2026-02-03 12:46:33
LAN Party Hivern 2026MarcL_ProMarc López2026-02-03 12:46:33
LAN Party Hivern 2026NeusFPSNeus Camps2026-02-03 12:46:33
LAN Party Hivern 2026SaraGamerSara Martínez2026-02-03 12:46:33
LAN Party Hivern 2026PaulaRockPaula RocaNoNo2026-02-03 12:46:33
LAN Party Primavera 2026AlbertAceAlbert ComaNo2026-02-03 12:46:33
LAN Party Primavera 2026DaniStarDani SolàNo2026-02-03 12:46:33
LAN Party Primavera 2026LaiaMasterLaia VallsNo2026-02-03 12:46:33
LAN Party Primavera 2026MarcL_ProMarc LópezNo2026-02-03 12:46:33
LAN Party Primavera 2026SaraGamerSara MartínezNoNo2026-02-03 12:46:33
📊

C4 – Resum d'inscripcions per LAN Party

ÀREA 2 – INSCRIPCIONS
📝 Justificació: Ens permet saber el resum de cada poble: quants inscrits, quants han pagat i quin percentatge d’assistència. El HAVING filtra sols les LAN Parties amb almenys 3 inscripcions. Usem COUNT condicional amb CASE i ROUND per calcular el percentatge d’assistència.
Tècniques SQL: LEFT JOINGROUP BYHAVINGSUMCASE WHENROUND
🖥️ Consulta:
SELECT lp.nom_événiment, lp.capacitat_maxima,
                  COUNT(i.id_inscripcio) AS total_inscrits,
                  SUM(CASE WHEN i.ha_pagat = 1 THEN 1 ELSE 0 END) AS han_pagat,
                  SUM(CASE WHEN i.ha_assistit = 1 THEN 1 ELSE 0 END) AS han_assistit,
                  ROUND(SUM(CASE WHEN i.ha_assistit=1 THEN 1 ELSE 0 END)*100.0/COUNT(i.id_inscripcio),1) AS pct_assistencia
           FROM lan_party lp
           LEFT JOIN inscripcions i ON lp.id_lan_party = i.id_lan_party
           GROUP BY lp.id_lan_party, lp.nom_événiment, lp.capacitat_maxima
           HAVING COUNT(i.id_inscripcio) >= 3
           ORDER BY total_inscrits DESC;
📋 Resultats (2 files):
nom_événimentcapacitat_maximatotal_inscritshan_pagathan_assistitpct_assistencia
LAN Party Hivern 202610087562.5
LAN Party Primavera 2026805400.0
📊

C5 – Tornejos amb el joc i la LAN Party

ÀREA 3 – JOCS I TORNEJOS
📝 Justificació: Vista resum de tots els tornejos amb el joc i l’poble associat. Molt útil per a la pàgina principal de la intranet. Usem un doble JOIN: tornejos → jocs i tornejos → lan_party, i ordenem per estat per mostrar primer els en curs.
Tècniques SQL: INNER JOIN (x2)ORDER BY
🖥️ Consulta:
SELECT t.id_torneig, t.nom_torneig, j.nom_joc, j.genere,
                  lp.nom_événiment, t.format, t.max_participants,
                  t.premi, t.estat, t.data_inici, t.data_fi
           FROM tornejos t
           INNER JOIN jocs j ON t.id_joc = j.id_joc
           INNER JOIN lan_party lp ON t.id_lan_party = lp.id_lan_party
           ORDER BY t.estat ASC, t.data_inici ASC;
📋 Resultats (6 files):
id_torneignom_torneignom_jocgenerenom_événimentformatmax_participantspremiestatdata_inicidata_fi
4Torneig FIFA 24 – 1v1FIFA 24EsportsLAN Party Hivern 2026eliminacio_directa4regalo valorat en 30€en_curs2026-02-16 14:002026-02-16 16:00
1Torneig CS2 – Fase FinalCounter-Strike 2FPSLAN Party Hivern 2026eliminacio_directa8regalo valorat en 60€finalitzat2026-02-15 11:002026-02-15 14:00
2Torneig Valorant – LligaValorantFPSLAN Party Hivern 2026lliga6regalo valorat en 40€finalitzat2026-02-15 15:002026-02-15 18:00
3Torneig LoL – EliminacióLeague of LegendsMOBALAN Party Hivern 2026eliminacio_directa4regalo valorat en 80€finalitzat2026-02-16 10:002026-02-16 13:00
5Torneig CS2 – PrimaveraCounter-Strike 2FPSLAN Party Primavera 2026lliga6regalo valorat en 50€obert2026-04-10 10:002026-04-10 13:00
6Torneig Rocket LeagueRocket LeagueEsportsLAN Party Primavera 2026eliminacio_directa4regalo valorat en 35€obert2026-04-11 10:002026-04-11 12:00
📊

C6 – Popularitat de jocs per participacions

ÀREA 3 – JOCS I TORNEJOS
📝 Justificació: Ens permet analitzar quins jocs són els més populars. Comptem tornejos i participants per joc. El HAVING elimina els jocs sense participacions. Usem COUNT(DISTINCT) per comptador únics de tornejos i COALESCE per manejar NULLs.
Tècniques SQL: LEFT JOIN (x2)GROUP BYHAVINGCOUNT(DISTINCT)MAXCOALESCE
🖥️ Consulta:
SELECT j.nom_joc, j.genere,
                  COUNT(DISTINCT t.id_torneig) AS num_tornejos,
                  COUNT(pt.id_participacio) AS num_participacions,
                  COALESCE(MAX(pt.puntuacio), 0) AS puntuacio_maxima
           FROM jocs j
           LEFT JOIN tornejos t ON j.id_joc = t.id_joc
           LEFT JOIN participants_torneig pt ON t.id_torneig = pt.id_torneig
           GROUP BY j.id_joc, j.nom_joc, j.genere
           HAVING COUNT(pt.id_participacio) > 0
           ORDER BY num_participacions DESC;
📋 Resultats (4 files):
nom_jocgenerenum_tornejosnum_participacionspuntuacio_maxima
Counter-Strike 2FPS26100
ValorantFPS1590
FIFA 24Esports140
League of LegendsMOBA14100
📊

C7 – Classificació global per puntuació total

ÀREA 3 – CLASSIFICACIONS
📝 Justificació: La classificació general és una de les pàgines clau de la intranet. Suma les puntuacions de tots els tornejos amb SUM, i usem MIN per mostrar la millor posició aconseguida. GROUP BY sobre participants_torneig amb JOIN cap a usuaris.
Tècniques SQL: INNER JOINGROUP BYSUMCOUNT(DISTINCT)MINORDER BY
🖥️ Consulta:
SELECT u.nick_joc, u.nom,
                  COUNT(DISTINCT pt.id_torneig) AS tornejos_jugats,
                  SUM(pt.puntuacio) AS puntuacio_total,
                  MIN(pt.posicio_final) AS millor_posicio
           FROM usuaris u
           INNER JOIN participants_torneig pt ON u.id_usuari = pt.id_usuari
           GROUP BY u.id_usuari, u.nick_joc, u.nom
           ORDER BY puntuacio_total DESC;
📋 Resultats (8 files):
nick_jocnomtornejos_jugatspuntuacio_totalmillor_posicio
MarcL_ProMarc López32251
SaraGamerSara Martínez32201
DaniStarDani Solà32052
LaiaMasterLaia Valls31203
NeusFPSNeus Camps3704
JordiXJordi Puig2206
PaulaRockPaula Roca10NULL
GerardGGGerard Font10NULL
📊

C8 – Jugadors amb almenys 2 victòries

ÀREA 3 – CLASSIFICACIONS
📝 Justificació: Identificar els jugadors amb millor rendiment competitiu. Usem subqueries correlades dins del SELECT i del WHERE per comptador victòries i partides jugades sense necesitat de GROUP BY complex. El WHERE filtra sols els jugadors amb ≥ 2 victòries.
Tècniques SQL: Subquery correlada (x3)WHEREORDER BY
🖥️ Consulta:
SELECT u.nick_joc, u.nom,
                  (SELECT COUNT(*) FROM partides p
                   WHERE p.id_guanyador = u.id_usuari AND p.estat='finalitzada') AS victoríes,
                  (SELECT COUNT(*) FROM partides p
                   WHERE (p.id_jugador1=u.id_usuari OR p.id_jugador2=u.id_usuari)
                     AND p.estat='finalitzada') AS partides_jugades
           FROM usuaris u
           WHERE (SELECT COUNT(*) FROM partides p
                  WHERE p.id_guanyador=u.id_usuari AND p.estat='finalitzada') >= 2
           ORDER BY victoríes DESC;
📋 Resultats (3 files):
nick_jocnomvictoríespartides_jugades
MarcL_ProMarc López56
SaraGamerSara Martínez46
DaniStarDani Solà36
📊

C9 – Classificació dins de cada torneig

ÀREA 3 – CLASSIFICACIONS
📝 Justificació: Cada torneig necessita mostrar la seva pròpia classificació amb nick i posició. Usem un triple JOIN (participants_torneig → tornejos → jocs → usuaris) i ordenem per torneig i posició final ascendent.
Tècniques SQL: INNER JOIN (x3)WHERE IS NOT NULLORDER BY
🖥️ Consulta:
SELECT t.nom_torneig, j.nom_joc, u.nick_joc, u.nom,
                  pt.posicio_final, pt.puntuacio
           FROM participants_torneig pt
           INNER JOIN tornejos t ON pt.id_torneig = t.id_torneig
           INNER JOIN jocs j ON t.id_joc = j.id_joc
           INNER JOIN usuaris u ON pt.id_usuari = u.id_usuari
           WHERE pt.posicio_final IS NOT NULL
           ORDER BY t.id_torneig ASC, pt.posicio_final ASC;
📋 Resultats (15 files):
nom_torneignom_jocnick_jocnomposicio_finalpuntuacio
Torneig CS2 – Fase FinalCounter-Strike 2MarcL_ProMarc López1100
Torneig CS2 – Fase FinalCounter-Strike 2SaraGamerSara Martínez280
Torneig CS2 – Fase FinalCounter-Strike 2DaniStarDani Solà360
Torneig CS2 – Fase FinalCounter-Strike 2LaiaMasterLaia Valls440
Torneig CS2 – Fase FinalCounter-Strike 2NeusFPSNeus Camps530
Torneig CS2 – Fase FinalCounter-Strike 2JordiXJordi Puig620
Torneig Valorant – LligaValorantSaraGamerSara Martínez190
Torneig Valorant – LligaValorantDaniStarDani Solà270
Torneig Valorant – LligaValorantLaiaMasterLaia Valls355
Torneig Valorant – LligaValorantNeusFPSNeus Camps440
Torneig Valorant – LligaValorantMarcL_ProMarc López525
Torneig LoL – EliminacióLeague of LegendsMarcL_ProMarc López1100
Torneig LoL – EliminacióLeague of LegendsDaniStarDani Solà275
Torneig LoL – EliminacióLeague of LegendsSaraGamerSara Martínez350
Torneig LoL – EliminacióLeague of LegendsLaiaMasterLaia Valls425
📊

C10 – Detall de partides amb guanyador

ÀREA 3 – PARTIDES
📝 Justificació: Vista completa de partides finalitzades amb noms llegibles. Necessita 4 JOINs: torneig, jugador1, jugador2 i guanyador. El guanyador pot ser NULL, per tant usem LEFT JOIN i COALESCE per mostrar ‘Empat / Pendent’.
Tècniques SQL: INNER JOIN (x3)LEFT JOINCOALESCEWHEREORDER BY
🖥️ Consulta:
SELECT t.nom_torneig, p.ronda,
                  u1.nick_joc AS jugador_1, u2.nick_joc AS jugador_2,
                  p.puntuacio_j1, p.puntuacio_j2,
                  COALESCE(ug.nick_joc, 'Empat / Pendent') AS guanyador,
                  p.estat, p.data_hora
           FROM partides p
           INNER JOIN tornejos t ON p.id_torneig = t.id_torneig
           INNER JOIN usuaris u1 ON p.id_jugador1 = u1.id_usuari
           INNER JOIN usuaris u2 ON p.id_jugador2 = u2.id_usuari
           LEFT JOIN usuaris ug ON p.id_guanyador = ug.id_usuari
           WHERE p.estat = 'finalitzada'
           ORDER BY t.id_torneig ASC, p.ronda ASC;
📋 Resultats (12 files):
nom_torneigrondajugador_1jugador_2puntuacio_j1puntuacio_j2guanyadorestatdata_hora
Torneig CS2 – Fase Final1MarcL_ProJordiX1610MarcL_Profinalitzada2026-02-15 11:00
Torneig CS2 – Fase Final1SaraGamerLaiaMaster149SaraGamerfinalitzada2026-02-15 11:30
Torneig CS2 – Fase Final1DaniStarNeusFPS1311DaniStarfinalitzada2026-02-15 12:00
Torneig CS2 – Fase Final2MarcL_ProSaraGamer1614MarcL_Profinalitzada2026-02-15 13:00
Torneig CS2 – Fase Final3MarcL_ProDaniStar1612MarcL_Profinalitzada2026-02-15 13:45
Torneig Valorant – Lliga1SaraGamerMarcL_Pro138SaraGamerfinalitzada2026-02-15 15:00
Torneig Valorant – Lliga1DaniStarLaiaMaster1310DaniStarfinalitzada2026-02-15 15:30
Torneig Valorant – Lliga1NeusFPSSaraGamer1013SaraGamerfinalitzada2026-02-15 16:00
Torneig Valorant – Lliga2SaraGamerDaniStar1311SaraGamerfinalitzada2026-02-15 16:30
Torneig LoL – Eliminació1MarcL_ProSaraGamer10MarcL_Profinalitzada2026-02-16 10:00
Torneig LoL – Eliminació1DaniStarLaiaMaster10DaniStarfinalitzada2026-02-16 10:45
Torneig LoL – Eliminació2MarcL_ProDaniStar10MarcL_Profinalitzada2026-02-16 11:30
📊

C11 – Missatges del xat amb autor

ÀREA 4 – COMUNICACIÓ
📝 Justificació: El sistema de xat necessita mostrar missatges en ordre cronològic amb el nick de l’autor i a quina LAN Party pertanyen. Usem JOIN amb usuaris i lan_party i CASE WHEN per mostrar l’estat de lectura llegiblement.
Tècniques SQL: INNER JOIN (x2)CASE WHENORDER BY
🖥️ Consulta:
SELECT lp.nom_événiment, u.nick_joc AS autor, m.contingut, m.data_hora,
                  CASE WHEN m.llegit = 1 THEN 'Llegit' ELSE 'No llegit' END AS estat_lectura
           FROM missatges_xat m
           INNER JOIN usuaris u ON m.id_usuari = u.id_usuari
           INNER JOIN lan_party lp ON m.id_lan_party = lp.id_lan_party
           ORDER BY lp.id_lan_party ASC, m.data_hora DESC;
📋 Resultats (8 files):
nom_événimentautorcontingutdata_horaestat_lectura
LAN Party Hivern 2026MarcL_ProHola a tots! Qui vol jugar CS2 primer?2026-02-03 12:46:33Llegit
LAN Party Hivern 2026SaraGamerJo! Tinc les ganes del món2026-02-03 12:46:33Llegit
LAN Party Hivern 2026DaniStarCompte, vaig a guanyar-vos a tots 😄2026-02-03 12:46:33Llegit
LAN Party Hivern 2026LaiaMasterOn és la sala de jocs?2026-02-03 12:46:33No llegit
LAN Party Hivern 2026NeusFPSSala 3, primera planta2026-02-03 12:46:33No llegit
LAN Party Hivern 2026MarcL_ProGG tots! Gran torneig2026-02-03 12:46:33No llegit
LAN Party Primavera 2026SaraGamerEns veiem a la primavera?2026-02-03 12:46:33No llegit
LAN Party Primavera 2026MarcL_ProSí! Ja m'han confirmat la inscripció2026-02-03 12:46:33No llegit
📊

C12 – Notificacions no llegides per tipus

ÀREA 4 – COMUNICACIÓ
📝 Justificació: L’usuari necessita saber quantes notificacions pendents té de cada categoria. Agrupa per tipus amb GROUP BY i HAVING per sols mostrar les que tenim pendents. Usem GROUP_CONCAT per llistar els títols dins d’una sola fila.
Tècniques SQL: GROUP BYHAVINGCOUNTGROUP_CONCATWHERE
🖥️ Consulta:
SELECT n.tipus,
                  COUNT(*) AS total_no_llegides,
                  GROUP_CONCAT(n.titol, ' | ') AS titols_pendents
           FROM notificacions n
           WHERE n.llegida = 0
           GROUP BY n.tipus
           HAVING COUNT(*) >= 1
           ORDER BY total_no_llegides DESC;
📋 Resultats (4 files):
tipustotal_no_llegidestitols_pendents
torneig2Torneig FIFA en curs | Resultats del Torneig CS2
xat1Nou missatge en el xat
sistema1Actualització del sistema
inscripcio1Inscripció confirmada
Documentació generada automàticament amb dades reals de lan_party.db · LAN Party Intranet · Febrer 2026