[MySQL] Tabelle "molti a molti", SELECT con troppe QUERY

DomyIT

Nuovo Utente
26 Lug 2018
9
0
1
Sto realizzando un Sito in PHP+MySQL.
Mi sto cimentando seriamente da poco in questo linguaggio, e mi trovo in una situazione che non so come gestirla al meglio.
Ho 2 tabelle in relazione "molti a molti", con una 3 tabella associativa.
La situazione è qualcosa del genere:
  1. ID (chiave) - Nome Utente - Password - Email
  2. ID (chiave) - Nome Evento - Data evento
  3. ID (Utente) - ID (Evento)
Quando carico la pagina con l'elenco degli eventi, devono apparirmi anche i Nomi Utente associati.
La strada più semplice (e credo anche la più sbagliata) è quella di fare un SELECT degli eventi, e ottengo tutte le informazioni che mi servono (fin qui tutto ok), ma il problema sorge per pescarmi i Nomi Utenti associati.
Dovrei (credo sbagliando) fare un ulteriore SELECT sulla tabella associativa ad ogni ciclo WHILE per pescarmi l'ID Utente, e poi un ulteriore SELECT in base all'ID dell'Utente per pescarmi il Nome Utente.
Il risultato è una marea di query...

Spero di aver reso l'idea.
C'è qualche funzione dedicata per "abbreviare" e caricare di meno il server con meno query e calcoli, ho strutturato io male il database o è tutto corretto?
Grazie anticipatamente.
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
prova così, dovrebbe estrarre solo le combinazioni esistenti
Codice:
select
  unione.IDutente
, unione.IDevento

, eventi.NomeEvento
, eventi.DataEvento

, utenti.NomeUtente
, utenti.Password
, utenti.Email

from
  unione
, eventi
, utenti

where eventi.IDevento = unione.IDevento
and   utenti.IDutente = unione.IDutente
… altre condizioni per isolare evento/utente

order by …..
l'ho volutamente sezionata per comprensione
 

DomyIT

Nuovo Utente
26 Lug 2018
9
0
1
Ok, unico problema che con questa query ottengo 2 volte lo stesso evento nel caso in cui questo è associato a 2 utenti.
Come posso poi convertire l'array in modo da rimuovere i duplicati degli eventi, e raggruppare gli username (magari in una sub-array del valore [si dice così?])?

Oppure ancora più comodo sarebbe avere 2 array, una per le informazioni sull'evento, e una per le informazioni sull'utente, ovviamente con numeri progressivi sincronizzati tra le 2 array, in modo da poterli poi stampare in "sincronia".

EDIT:
Ho elaborato qualcosina:
PHP:
$num = 0;
$arr = -1;
while($row = $result->fetch_assoc()) {
    if ($num != $row['IDevento']) {
        $events[] = $row;
        $arr++;
    }
    $events[$arr]['NomeUtente'][] = $row['NomeUtente'];
    $num = $row['IDevento'];
    #$events[] = $row;
}
Ottengo quindi la variabile $events con tutte le informazioni che mi servono.
Un approccio di questo tipo (in PHP) è corretto o "poco giusto"?
 
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
Un approccio di questo tipo (in PHP) è corretto o "poco giusto"?
tutto é giusto quando si ottiene il risultato desiderato.

se l'obiettivo é una lista di eventi e persone, puoi sfruttare la query che ti ho postato e stampare direttamente, controllando l'evento del record in esame con il precedente,
se diverso stampi evento e persona, altrimenti ometti l'evento e stampi solo la persona,
in questo modo non devi costruire array, ma forse non conosco il tuo obiettivo
 

DomyIT

Nuovo Utente
26 Lug 2018
9
0
1
Passo la variabile ad un template system per evitare che chi scrive i template possa usare il PHP, quindi in base a questa mia esigenza, sbaglio con l’array?

Chiedo consiglio dato che mi sono affacciato da poco alla programmazione PHP.

Diciamo che a funzionare funziona, volevo solo capire se era la strada giusta per performance, pulizia e quant’altro...
 

DomyIT

Nuovo Utente
26 Lug 2018
9
0
1
Ho un problema con la tua query, ovvero dovrei poter dare il LIMIT solo per la tabella "eventi", questo per poter effettuare una corretta impaginazione...
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
Ho un problema con la tua query, ovvero dovrei poter dare il LIMIT solo per la tabella "eventi", questo per poter effettuare una corretta impaginazione...
continuo a capire ( e condividere ) poco di ciò che stai facendo, ma,
se hai un evento con 150 (esagero) utenti, la paginazione dove va a finire ?????
 

DomyIT

Nuovo Utente
26 Lug 2018
9
0
1
Mi sono espresso male probabilmente, il mio intento è di mostrare la lista degli eventi (li impagino con il LIMIT alla query), e per ogni evento mostro gli utenti (sempre nella lista degli eventi).
Gli utenti possono essere non più di 5, o comunque un numero basso...
Da qui l'esigenza di limitare la query solo in base agli eventi, mentre con la tua query lo stesso evento può essere contenuto più volte (per ogni utente iscritto), e quindi il LIMIT andrebbe a filtrare male, perchè considera anche le righe relative agli iscritti.

Spero di aver reso il concetto.
Mi sto studiando meglio la funzione JOIN perchè credo debbo ricorrere a questa...

EDIT
Riesco ad ottenere il risultato che desideravo con qualcosa simile:
PHP:
SELECT tab1.*, tab2.*, tab3.* FROM tab1 RIGHT JOIN (SELECT * FROM tab2 WHERE ... LIMIT ...") AS var2 ON tab1.id=var2.id LEFT JOIN tab3 AS var3 ON tab1.id=var3.id ORDER BY ...;
Ora il problema è: come faccio ad ottenere il numero di righe trovate (senza limit) per la tab2?
Questo dato mi serve per l'impaginazione (totale articoli visualizzabili, diviso risultati per pagina, uguale numero dell'ultima pagina).
 
Ultima modifica:
Discussioni simili
Autore Titolo Forum Risposte Data
T colonne di tabelle mysql ordinate MySQL 0
S Problema esportazione tabelle Mysql in Excel PHP 0
G eseguire calcoli matematici su risultati 2 tabelle mysql PHP 4
G Problema caricamento tabelle MySql da PhP PHP 0
L update tabelle in php mysql [risolto] PHP 6
M Esportare tabelle mdb con relazioni in mysql MS Access 0
elpirata [MySQL] Sincronizzare dati tra due tabelle sullo stesso host MySQL 0
T mysql tutorial per importare tabelle access in mysql aiuto MySQL 2
I database mysql estrarre due tabelle Database 2
felino [MySQL] [PHPMyAdmin] Tabelle sincronizzate tra loro... MySQL 0
simgia [MySQL] Copiare dati tra 2 tabelle MySQL 1
C Php/Mysql query JOIN tra tabelle PHP 4
C Php/Mysql query JOIN tra due tabelle PHP 18
P [MYSQL] Query su tabelle con clausola "essenziale" MySQL 10
C [MySQL] export tabelle - import tabelle MySQL 14
A [MySQL] tabelle sql MySQL 2
A [MySQL] tabelle dati su app android MySQL 2
felino [MySQL] "Sicronizzare" due tabelle tramite il campo di relazione MySQL 0
M [PHP - MYSQL] Mantenere filtro query in tabelle paginate PHP 3
O tabelle disabilitate mysql MySQL 0
A calcoli su valori di tabelle diverse in db mysql PHP 4
J [MySQL] Ricerca in due tabelle MySQL 21
felino [RISOLTO] [MySQL] Unire due tabelle esistenti in una nuova MySQL 1
D Selezione di dati da più tabelle in Mysql PHP 3
kungfujava MySQL & PHP Tabelle PHP 4
Fanki Sib Modifica tabelle mysql - inserimento immagini PHP 1
Monital Copiare e modificare tabelle Mysql con php PHP 3
I estrarre record da 2 tabelle mysql con riferimento id_utente uguale Database 3
S Estrarre dati da diverse tabelle mysql PHP 6
I relazioni tra 2 tabelle mysql PHP 3
neo996sps [PHP + MySQL] Merge di due tabelle Mysql differenti e non relazionate PHP 6
D visualizzazione dati da più tabelle tramite php e mysql PHP 10
D PHP+MYSQL Tabelle PHP 1
A Accesso e recupero informazioni su db mysql e 2 tabelle. Php lento nell'esecuzione. PHP 4
R Evitare SPAM nelle tabelle DI MYSQL MySQL 6
Monital [Mysql]Confronto tra tabelle ed inseirmento dati- Comando JOIN (Credo) MySQL 0
D [php - mysql] creazione di tabelle PHP 9
foki MySql - Problema Tabelle !!! Consiglio+++ MySQL 0
M randomizzare tabelle mysql?? PHP 0
Z non comprendo il significato dei campi delle tabelle in mysql MySQL 2
J Collegare tabelle mysql su access MS Access 0
B Allegare tabelle MYSQL su Db Access MS Access 3
K form Inserimento record mysql PHP 2
P Mysql lento a cancellare MySQL 1
P Codifica caratteri speciali mysql php PHP 0
N MAX() + ADD_DATE - per update su Mysql MySQL 0
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
W MySQL ciclo in SELECT MySQL 0

Discussioni simili