theodoros8 Δημοσ. 30 Αυγούστου 2013 Δημοσ. 30 Αυγούστου 2013 Καλησπερα! Θελω μια βοηθεια για ενα προβλημα που εχω. Εχω ενα πινακα: id date from_name to_name from_id to_id message 1 2013-08-29 07:20:00 John Maria 1234 4321 hi! 2 2013-08-28 05:20:00 Justin Aliko 1234 9988 Where ru? 3 2013-08-29 08:21:00 Helen Aliko 5678 9988 Good! 4 2013-08-27 02:20:00 Jesus Aliko 9876 9988 where? 5 2013-08-26 02:20:00 Jesus Aliko 9876 9988 what? Να πουμε πως θελω να κανω : Select * from TABLE where to_id='9988' group by from_id order by date desc; το οποιο θα μου δωσει: 4 2013-08-27 02:20:00 Jesus Aliko 9876 9988 where? 2 2013-08-28 05:20:00 Justin Aliko 1234 9988 Where ru? 3 2013-08-29 08:21:00 Helen Aliko 5678 9988 Good! To θεμα ειναι οτι για το entrie με το id 2, μου δινει την πιο παλια εγγραφη αλλα εγω θελω την πιο προσφατη κατι το οποιο δεν μπορω να βρω πως να το κανω. Για να κατανοήσετε καλυτερα,φανταστειτε το inbox στο Facebook οπου εχει τα μυνηματα ανα παραληπτη και με μικροτερα γραμματα το τελευταιο μηνυμα. Ευχαριστω.
Moderators Praetorian Δημοσ. 30 Αυγούστου 2013 Moderators Δημοσ. 30 Αυγούστου 2013 Κάτι δεν καταλαβαίνω καλά από το post σου. Στο select σου, κρατάς ένα συγκεκριμένο παραλήπτη ('9988') και ομαδοποιείς ανά αποστολέα, αλλά χωρίς κάποια aggregate function. (και το πιθανό αποτέλεσμα που δίνεις δεν είναι ordered by date desc, αλλά επίσης χωρίς aggregate function δεν είναι standard ποια γραμμή θα επιστραφεί ανα grouping). Θέλεις το πιο πρόσφατο μήνυμα ανά αποστολέα και για συγκεκριμένο παραλήπτη (9988); πχ κάτι σαν Select max(date) as lastMsg, id, from_name, to_name, from_id, to_id, message from messages where to_id='9988' group by from_id order by lastMsg desc ; Αυτό θα σου έδινε τα μηνύματα 3,2,4 με αυτή τη σειρά.
lion2486 Δημοσ. 30 Αυγούστου 2013 Δημοσ. 30 Αυγούστου 2013 έχω πολύ καιρό να κάνω τέτοια πράγματα.. μου φάνηκε λογικό αυτό που έκανες και έκανα μια δοκιμή και κάπως μου φάνηκε οκ.. select * from test where to_id=9988 AND id in (select id from test GROUP BY from_id ORDER BY date desc);
theodoros8 Δημοσ. 31 Αυγούστου 2013 Μέλος Δημοσ. 31 Αυγούστου 2013 Τσουκου! κανενα απο τα δυο statements δεν μου εκανε την δουλεια μου,δλδ να κανει group ανα αποστολέα και να διαλεγει το πιο προσφατο μηνυμα. Θα παραθεσω ακριβως οπως εχω το table μου μπας και τρεξετε κανενα παραδειγμα στη δικια σας DB(αν εχετε ορεξη φυσικα) id date from_name to_name from_udid to_udid message 1 2013-08-29 07:20:00 teo Μαρια 1234 4321 Γεια σου 2 2013-08-29 07:26:00 teo βασιλης 1234 5678 ελα ρε! 3 2013-08-28 09:00:00 βασιλης Μαρια 5678 4321 xaxa ωραιο αστειο 4 2013-08-29 11:00:00 κιτσος βασιλης 8765 5678 σιγουρα 5 2013-08-28 09:00:00 Μαρια βασιλης 4321 5678 ειμαι σπιτι 6 2013-08-28 09:00:00 κιτσος teo 8765 1234 παμε για καφε? 7 2013-08-27 00:00:00 βασιλης τεο 5678 1234 ελα ρε συ 8 2013-08-29 08:00:00 κιτσος teo 8765 1234 ασε ρε 9 2013-08-28 00:00:00 κιτσος Μαρια 8765 4321 Γεια σου Μαρια ελα για καφε 10 2013-08-29 01:00:00 βασιλης Μαρια 5678 4321 σταματα ρε Αρα το επομενο : SELECT * FROM messages WHERE to_udid=4321 group by from_udid order by date desc θα μας εδινε αυτο: id date from_name to_name from_udid to_udid message 1 2013-08-29 07:20:00 teo Μαρια 1234 4321 Γεια σου 3 2013-08-28 09:00:00 βασιλης Μαρια 5678 4321 xaxa ωραιο αστειο 9 2013-08-28 00:00:00 κιτσος Μαρια 8765 4321 Γεια σου Μαρια ελα για καφε το οποιο ειναι σωστο εκτος απο τα μηνυματα του Βασιλη οπου μας δειχνει οτι τελευταιο του μηνυμα ειναι στις 28-8 και οχι αυτο στις 29-8 (αυτο με το id=10) To σωστο θα ηταν: id date from_name to_name from_udid to_udid message 1 2013-08-29 07:20:00 teo Μαρια 1234 4321 Γεια σου 10 2013-08-29 01:00:00 βασιλης Μαρια 5678 4321 σταματα ρε 9 2013-08-28 00:00:00 κιτσος Μαρια 8765 4321 Γεια σου Μαρια ελα για καφε Ελπιζω να εγινα κατανοητος και ελπιζω σε βοηθεια γιατι ειλικρινα το θελω αυτο!!!
warlock9_0 Δημοσ. 31 Αυγούστου 2013 Δημοσ. 31 Αυγούστου 2013 θελει join http://stackoverflow.com/questions/612231/how-can-i-select-rows-with-maxcolumn-value-distinct-by-another-column-in-sql
Moderators Praetorian Δημοσ. 31 Αυγούστου 2013 Moderators Δημοσ. 31 Αυγούστου 2013 Μπορείς να μου πεις τι πήρες ακριβώς από το δικό μου statement. Γιατί εγώ παίρνω αυτό που δίνεις στο τελευταιο snippet. Edit: θα συμφωνήσω ότι ο σωστός τρόπος είναι με το join (όπως αναφέρεται και στο link από το stackoverflow που δίνει ο warlock9_0). Αυτό που πρότεινα, δούλεψε σε SQLlite, αλλά είναι μάλλον μπακάλικος τρόπος που δε θα δουλέψει σε κάθε DBMS.
theodoros8 Δημοσ. 31 Αυγούστου 2013 Μέλος Δημοσ. 31 Αυγούστου 2013 Μπορείς να μου πεις τι πήρες ακριβώς από το δικό μου statement. Γιατί εγώ παίρνω αυτό που δίνεις στο τελευταιο snippet. Edit: θα συμφωνήσω ότι ο σωστός τρόπος είναι με το join (όπως αναφέρεται και στο link από το stackoverflow που δίνει ο warlock9_0). Αυτό που πρότεινα, δούλεψε σε SQLlite, αλλά είναι μάλλον μπακάλικος τρόπος που δε θα δουλέψει σε κάθε DBMS. Pretorian δουλεψε αψογα...! Σε υπερευχαριστω οπως και τα αλλα παιδια!!! Ουτε Stackoverflow να ειμασταν(μην σου πω καλυτερο!!!) Να ειστε καλα!
Moderators Praetorian Δημοσ. 31 Αυγούστου 2013 Moderators Δημοσ. 31 Αυγούστου 2013 Pretorian δουλεψε αψογα...! Σε υπερευχαριστω οπως και τα αλλα παιδια!!! Ουτε Stackoverflow να ειμασταν(μην σου πω καλυτερο!!!) Να ειστε καλα! Για να μη σε πάρω στο λαιμό μου, θα επιμείνω να χρησιμοποιήσεις τη λύση με join που προτείνουν στο link του warlock9_0.
theodoros8 Δημοσ. 31 Αυγούστου 2013 Μέλος Δημοσ. 31 Αυγούστου 2013 Για να βοηθησω και αλλους,οριστε και με το join: SELECT tt.* FROM messages tt INNER JOIN ( SELECT id,from_udid,from_name,to_udid,to_name, MAX(date) AS MaxDateTime FROM messages where to_udid=4321 GROUP BY from_udid ) groupedtt ON tt.from_udid = groupedtt.from_udid AND tt.date = groupedtt.MaxDateTime ORDER BY tt.date DESC
Moderators Praetorian Δημοσ. 31 Αυγούστου 2013 Moderators Δημοσ. 31 Αυγούστου 2013 Η δική μου εκδοχή: SELECT tt.* FROM messages tt INNER JOIN (SELECT from_udid, max(date) as MaxDateTime FROM messages where to_udid= 4321 GROUP BY from_udid ) groupedtt ON tt.from_udid = groupedtt.from_udid and tt.date= groupedtt.MaxDateTime and tt.to_udid= 4321 order by tt.date desc; Έβαλα και τη συνθήκη tt.to_udid= '4321' στο ΟΝ του INNER JOIN γιατί από μόνα τους τα date και from_udid δεν προσδιορίζουν μοναδικά μια γραμμή, οπότε αυτό κάπως λύνει το πρόβλημα* (δεδομένου ότι δεν θα υπάρχουν πολλαπλά μηνύματα από τον Α προς τον Β (4321) την ίδια χρονική στιγμή). * Πχ αν είχες μια εξτρα καταχώρηση (με ίδιο date και from_udid με κάποια από τα rows του groupedtt αλλά ωστόσο διαφορετικό to_udid) : id date from_name to_name from_udid to_udid message ---|---------------------|----------|--------|----------|--------|---------| 11 | 2013-08-29 01:00:00 |βασιλης |teo | 5678 |1234 |pxpxpxpxp To SQL ερώτημά σου θα έφερνε και αυτή τη γραμμή αν και δεν είναι προς τη Μαρία (4321): 1
theodoros8 Δημοσ. 31 Αυγούστου 2013 Μέλος Δημοσ. 31 Αυγούστου 2013 αυτο δεν θα το ειχα φανταστει.Ωραια!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα