Php/Mysql query JOIN tra due tabelle

  • Creatore Discussione Creatore Discussione colomber
  • Data di inizio Data di inizio

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?
 
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:
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
 
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:
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.
 
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 ????
 
non funzione ne e con gli as, il copia incolla non è andato male, risultato non funziona..
 
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
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
 
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?
 
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
 
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)
 
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:

Discussioni simili