Προς το περιεχόμενο

τα φωτα σας για ενα SQL statement


theodoros8

Προτεινόμενες αναρτήσεις

Καλησπερα!

Θελω μια βοηθεια για ενα προβλημα που εχω.

 

Εχω ενα πινακα:

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

Κάτι δεν καταλαβαίνω καλά από το 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 με αυτή τη σειρά.
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

έχω πολύ καιρό να κάνω τέτοια πράγματα..  μου φάνηκε λογικό αυτό που έκανες και έκανα μια δοκιμή και κάπως μου φάνηκε οκ..

select * from test where to_id=9988 AND id in (select id from test GROUP BY from_id ORDER BY date desc);
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τσουκου! κανενα απο τα δυο 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	Γεια σου Μαρια ελα για καφε 

Ελπιζω να εγινα κατανοητος και ελπιζω σε βοηθεια γιατι ειλικρινα το θελω αυτο!!!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Moderators

Μπορείς να μου πεις τι πήρες ακριβώς από το δικό μου statement. Γιατί εγώ παίρνω αυτό που δίνεις στο τελευταιο snippet.

 

Edit: θα συμφωνήσω ότι ο σωστός τρόπος είναι με το join (όπως αναφέρεται και στο link από το stackoverflow που δίνει ο warlock9_0). Αυτό που πρότεινα, δούλεψε σε SQLlite, αλλά είναι μάλλον μπακάλικος τρόπος που δε θα δουλέψει σε κάθε DBMS.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μπορείς να μου πεις τι πήρες ακριβώς από το δικό μου statement. Γιατί εγώ παίρνω αυτό που δίνεις στο τελευταιο snippet.

 

Edit: θα συμφωνήσω ότι ο σωστός τρόπος είναι με το join (όπως αναφέρεται και στο link από το stackoverflow που δίνει ο warlock9_0). Αυτό που πρότεινα, δούλεψε σε SQLlite, αλλά είναι μάλλον μπακάλικος τρόπος που δε θα δουλέψει σε κάθε DBMS.

Pretorian δουλεψε αψογα...! Σε υπερευχαριστω οπως και τα αλλα παιδια!!! Ουτε Stackoverflow να ειμασταν(μην σου πω καλυτερο!!!)

Να ειστε καλα!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Moderators

Pretorian δουλεψε αψογα...! Σε υπερευχαριστω οπως και τα αλλα παιδια!!! Ουτε Stackoverflow να ειμασταν(μην σου πω καλυτερο!!!)

Να ειστε καλα!

Για να μη σε πάρω στο λαιμό μου, θα επιμείνω να χρησιμοποιήσεις τη λύση με join που προτείνουν στο link του warlock9_0.
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Για να βοηθησω και αλλους,οριστε και με το 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

Η δική μου εκδοχή:

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):
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...