Sto costruendo un flusso di attività per il nostro sito e ho fatto alcuni progressi decenti con qualcosa che funziona abbastanza bene.MySQL GROUP BY intelligente per flussi di attività
E 'alimentato da due tabelle:
flusso:
id
- Unico flusso Voce IDuser_id
- ID dell'utente che ha creato l'oggetto flussoobject_type
- Tipo di oggetto (attualmente "venditore" o "prodotto")object_id
- ID interno dell'oggetto (attualmente l'ID venditore o l'ID del prodotto)action_name
- L'azione intrapresa contro l'oggetto (attualmente o 'acquistare' o 'cuore')stream_date
- Timestamp che l'azione era creato.hidden
- Booleano di se l'utente ha scelto di nascondere l'elemento.
segue:
id
- Unico Segui IDuser_id
- L'ID utente della persona l'azione 'seguire'.following_user
- L'ID dell'utente che viene seguito.followed
- Timestamp che l'azione seguente è stata eseguita.
Attualmente sto utilizzando la seguente query per estrarre il contenuto dal database:
Query:
SELECT stream.*,
COUNT(stream.id) AS rows_in_group,
GROUP_CONCAT(stream.id) AS in_collection
FROM stream
INNER JOIN follows ON stream.user_id = follows.following_user
WHERE follows.user_id = '1'
AND stream.hidden = '0'
GROUP BY stream.user_id,
stream.action_name,
stream.object_type,
date(stream.stream_date)
ORDER BY stream.stream_date DESC;
Questa query effettivamente funziona abbastanza bene, e con un po 'di PHP per analizzare i dati restituiti da MySQL possono creare un buon flusso di attività con azioni dello stesso tipo da parte dello stesso utente che viene raggruppato insieme se il tempo tra le azioni non è troppo grande (vedi sotto l'esempio).
La mia domanda è, come faccio a fare questo più intelligente? Attualmente raggruppa per asse, l'attività "utente", quando ci sono più elementi di un particolare utente entro un certo periodo di tempo, MySQL sa raggrupparli.
Come posso rendere questo ancora più intelligente e raggruppare da un altro asse, come "object_id" quindi se ci sono più azioni per lo stesso oggetto in sequenza questi elementi sono raggruppati, ma mantenere la logica di raggruppamento che abbiamo attualmente per le azioni di raggruppamento/oggetti per utente. E l'implementazione di questo senza duplicazione dei dati?
Esempio di più oggetti che appaiono in sequenza:
Capisco soluzioni a problemi come questo può diventare molto complessa, molto rapidamente, ma mi chiedo se c'è un elegante e abbastanza semplice soluzione questo (si spera) in MySQL.
Argh. La disfunzione di MySQL chiamata "colonne nascoste" GROUP BY "potrebbe rendere difficile la comprensione della query. Rende difficile per gli altri capirlo. Vedi questo: http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html –
Come vorresti qualcosa da raggruppare quando un singolo utente compra più cose, ma una (o più) di questi prodotti sono anche raggruppati? Ad esempio, nel tuo ultimo esempio, cosa accadrebbe se Christion acquistasse anche l'oro Treehouse? Sarebbe stato aggiunto al suo gruppo, al gruppo della casa sull'albero o ad entrambi? –
@HugoDelsing Oltre a raggruppare azioni simili dello stesso utente insieme, dovrebbe raggruppare elementi che appaiono vicini l'uno all'altro da utenti diversi in cui questi elementi non sono già raggruppati. Per esempio. Come Joe, India e Walt hanno acquistato Treehouse nell'esempio sopra, e questi sono vicini, questi dovrebbero essere raggruppati, anche se sono da utenti diversi. –