Domanda

Ho problemi formando una query MySQL che esegue le seguenti azioni:

Seleziona i threadIDs dall'ordinamento tavolo discussioni dal timestamp (in ordine discendente) del più recente post (più grande) con timestamp ThreadID pari al ThreadID di ciascun filo. Quindi, fondamentalmente voglio passare attraverso i fili e hanno MySQL verificare il database per diciamo filo 0. Quindi controlla tutti i post che hanno ThreadID di 0 e sorta Thread0 sulla base del massimo timestamp dei posti all'interno della Thread0. Poi ripete questo per Thread1, Thread2, ecc e le ordina di conseguenza.

Questo è anche possibile? È per creare l'effetto "bump-system" del foro, in cui il filato recentemente attivo viene urtato alla cima all'elenco prolungata del filo si spegne, poi lascia cadere sul fondo. Ho usato per usare un'implementazione diversa in cui ho conservato un timestamp lastActivity nella tabella fili e aggiornato quando un nuovo post è stato presentato nella filettatura, ma questa query renderebbe le cose molto più efficiente.

Grazie mille! Ci sono due tavoli importanti qui: discussioni e messaggi. I montanti avere un campo ThreadID che memorizza l'ID del thread appartiene, e ha anche un campo timestamp. Le discussioni ha un ThreadID campo che corrisponde al ThreadID del palo.

È stato utile?

Soluzione

Di seguito ha lavorato per me in passato su MySql. Se si desidera includere più su ogni filo nella query dovrete aggiungere le colonne alla SELECT e la GROUP BY.

select thread.threadID, max(comments.modifiedOn) as threadUpdated 
   from thread inner join comments on thread.threadID = comments.threadID 
   group by 1 
   order by 2 desc;

Questa query serve la richiesta primaria, che è una lista di fili ordinato mio ultimo commento. Non tornerà discussioni con commenti così come sono, si avrebbe bisogno di cambiare il join ad un outer join per farlo.

Altri suggerimenti

SELECT  *
FROM    threads t
LEFT JOIN
        posts p
ON      p.id =
        (
        SELECT  p.id
        FROM    posts pi
        WHERE   pi.threadID = t.threadID
        ORDER BY
                pi.timestamp DESC
        LIMIT 1
        )

Avere un indice su posts (threadID, timestamp) migliorerà notevolmente la query.

Si noti che a differenza delle soluzioni GROUP BY, questa query seleziona anche tutti i campi da posts e funziona anche se avete i duplicati sulle ultime posts.timestamp.

SELECT t.*, p1.`timestamp`
FROM threads t 
  JOIN posts p1 ON (p1.threadid = t.id)
  LEFT JOIN posts p2 ON (p2.threadid = t.id 
    AND p1.`timestamp` < p2.`timestamp`)
WHERE p2.threadid IS NULL
ORDER BY p1.`timestamp` DESC;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top