Php/Mysql query JOIN tra due tabelle

colomber

Utente Attivo
4 Dic 2012
232
1
18
Salve ho un problema con una JOIN tra queste due tabelle:

1° TABELLA NOME: DISCUSSIONE

id_discussione
titolo_discussione
datacreazione_discussione
autore _discussione

2° TABELLA NOME: RISPOSTA

id_risposta
id_discussione
risposta
datacreazione_risposta
autore _risposta


Devo recuperare id_discussione, titolo_discussione, datacreazione_discussione, autore _discussione da tabella DISCUSSIONE e ordinarli in base alla datacreazione_risposta più recente.

Qualcuno può aiutarmi?
 

marino51

Utente Attivo
28 Feb 2013
2.931
166
63
Lombardia
provata su ms ssql sembra corretta (no errori di sintassi)
PHP:
SELECT
   d.id_discussione
  ,d.titolo_discussione
  ,d.datacreazione_discussione
  ,d.autore_discussione
FROM discussione d
LEFT JOIN risposta r
ON d.id_discussione=r.id_discussione
ORDER BY r.datacreazione_risposta DESC
ma forse non ho capito bene .... quale risultato ti serve
 
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
2.931
166
63
Lombardia
questa è una soluzione con risultato diverso
PHP:
SELECT
   x.id_discussione
  ,x.titolo_discussione
  ,x.datacreazione_discussione
  ,x.autore_discussione
FROM
(
  SELECT
     d.id_discussione
    ,d.titolo_discussione
    ,d.datacreazione_discussione
    ,d.autore_discussione
    ,MAX(r.datacreazione_risposta) as datacreazione_risposta
  FROM discussione d
  LEFT JOIN risposta r
  ON d.id_discussione=r.id_discussione
  GROUP BY
     d.id_discussione
    ,d.titolo_discussione
    ,d.datacreazione_discussione
    ,d.autore_discussione
) x
ORDER BY x.datacreazione_risposta DESC
 

colomber

Utente Attivo
4 Dic 2012
232
1
18
riporta il testo dell'errore per cortesia
la prima query son riuscita a farla funzionare senza gli AS non andava, l ordinamento è ok, c'è un problema però mi riporta le discussioni duplicate ad esempio la discussione X ha 10 risposte, la query mi riporta la discussione X 10 volte
 
Ultima modifica:

colomber

Utente Attivo
4 Dic 2012
232
1
18
mi sto sciogliendo :) ma non funziona... ma provare a modificare la prima?

query d.id_discussione=r.id_discussione è ok d.id_discussione è 1 solo r.id_discussione é invece presente in ogni risposta della discussione se una discussione ha 5 risposte la query mi restituisce 5 volte lo stesso risultato.
 

marino51

Utente Attivo
28 Feb 2013
2.931
166
63
Lombardia
la seconda è la prima modificata,
ma tu ti stai sciogliendo, io vorrei invece capirti quando scrivi

"ma non funziona"

ti rifaccio le domande,
come la prima senza gli AS ????
hai perso per strada la x ????
hai dimenticato una parentesi ????
il copia incolla è terminato male ?????
si è spento il pc mentre la eseguivi ????
 

colomber

Utente Attivo
4 Dic 2012
232
1
18
non funzione ne e con gli as, il copia incolla non è andato male, risultato non funziona..
 

marino51

Utente Attivo
28 Feb 2013
2.931
166
63
Lombardia
non funzione ne e con gli as, il copia incolla non è andato male, risultato non funziona..
capisco la tua rimostranza "non funziona"
capisco meno perché non spieghi il motivo per cui non funziona,
siccome non vorrei spendere altro tempo per questa banalità,
questi sono i risultati delle due query, con aggiunta la data della risposta per "capire"

prima query con le discussioni estratte più volte, ordinate per risposta più attuale
upload_2017-8-4_17-54-59.png


seconda query con discussioni estratte 1 sola volta e ordinate per risposta più attuale
upload_2017-8-4_17-57-30.png


certo, vengono estratte anche le discussioni che non hanno risposte
ma tu non hai precisato se ti servivano oppure no

ora, perché non funzionano ?

il copia incolla è terminato male ?????
si è spento il pc mentre la eseguivi ????
 
Ultima modifica:
  • Like
Reactions: colomber

marino51

Utente Attivo
28 Feb 2013
2.931
166
63
Lombardia
potrebbe essere che nei campi "autore", per il caldo, dopo la parola "autore" hai messo uno spazio ?
mentre nei miei esempi l'ho tolto, per non incasinare un mondo che è già incasinato di suo
 

colomber

Utente Attivo
4 Dic 2012
232
1
18
Funziona perfettamente ti ringrazio sei veramente bravo non riesco a spiegare come mai prima non funzionava prima;

se volessi recuperare anche anche l'ultimo autore_risposta e relativa datacreazione _risposta come si fa?
 

marino51

Utente Attivo
28 Feb 2013
2.931
166
63
Lombardia
Funziona perfettamente non riesco a spiegare come mai prima non funzionava prima
neppure io, pur avendo sviluppato la query senza provarla,
provandola, ha funzionato al primo colpo ....
forse ti serviva la certificazione del funzionamento ? è un esercizio scolastico ?
cercherò nelle tue discussioni passate perché ricordo un precedente molto "uguale"

queste variazioni funzionano !
PHP:
....
  ,x.autore_discussione
  ,y.autore_risposta
  ,x.datacreazione_risposta
FROM
....
) x
LEFT JOIN risposta y
ON  x.id_discussione=y.id_discussione
AND x.datacreazione_risposta=y.datacreazione_risposta
ORDER BY x.datacreazione_risposta DESC, x.datacreazione_discussione DESC
 

marino51

Utente Attivo
28 Feb 2013
2.931
166
63
Lombardia
PHP:
SELECT
   x.id_discussione
  ,x.titolo_discussione
  ,x.datacreazione_discussione
  ,x.autore_discussione
  ,y.autore_risposta
  ,x.datacreazione_risposta
FROM
(
  SELECT
     d.id_discussione
    ,d.titolo_discussione
    ,d.datacreazione_discussione
    ,d.autore_discussione
    ,MAX(r.datacreazione_risposta) as datacreazione_risposta
  FROM discussione d
  LEFT JOIN risposta r
  ON d.id_discussione=r.id_discussione
  GROUP BY
     d.id_discussione
    ,d.titolo_discussione
    ,d.datacreazione_discussione
    ,d.autore_discussione
) x
LEFT JOIN risposta y
ON  x.id_discussione=y.id_discussione
AND x.datacreazione_risposta=y.datacreazione_risposta
ORDER BY x.datacreazione_risposta DESC, x.datacreazione_discussione DESC
" ,x.datacreazione_risposta" se da fastidio, può essere eliminata dalla select

prima della "group by" potrebbero essere incluse clausole "where" per ridurre il set estratto
(esempio, limiti di date)
 

colomber

Utente Attivo
4 Dic 2012
232
1
18
funziona perfettamente!

per quanto riguarda x.datacreazione_risposta formattavo la data in questo modo dopo la prima select:

DATE_FORMAT(datacreazione_risposta, '%d-%m-%Y %H:%i') AS ddatacreazione_risposta

ho provato ad aggiunegre le x ma non funziona

DATE_FORMAT(x.datacreazione_risposta, '%d-%m-%Y %H:%i') AS x.ddatacreazione_risposta



al massimo la gestisco sull'output la converto da testo in data e bon
 
Ultima modifica: