[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
2.903
160
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
2.903
160
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
2.903
160
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: