Witam, chciałbym jednym zapytaniem załatwić sprawę pobierania osób z którymi prowadzę najwięcej korespondencji, baza jest prosta:

ID TO FROM MESSAGE DATE

Wszystko by było proste gdyby nie fakt, że muszę policzyć wiadomości przesłane do mnie oraz te ode mnie.

  1. (SELECT message, date FROM messages WHERE (`from`='.$rid.' AND `to`='.$uid.') ) UNION (SELECT message, date FROM messages WHERE (`to`='.$rid.' AND `from`='.$uid.'))


W zapytaniu powyżej znam swojego rozmówicę i pobieram korespondencję z nim, ale jak Zadać pytanie, kiedy chcę wybrać ze wszystkich userów?


37 - to moje ID
  1.  
  2. SELECT count(m.id),m.message, m.date
  3. FROM messages m, users u
  4. WHERE (
  5. `from` = u.id
  6. AND `to` =37
  7. )
  8. UNION SELECT count(m.id),m.message, m.date
  9. FROM messages m, users u
  10. WHERE (
  11. `to` = u.id
  12. AND `from` =37
  13. )
  14. ) AS m
  15. LIMIT 0 , 30


No i wymyśliłem takie zapytanie, ale pokazuje mi ile jest wysłanych i przysłanych, a chciałbym, żeby rozdzielał to jeszcze na użytkowników

Idąc dalej wymyśłiłem coś takiego:


  1. SELECT *
  2. FROM (
  3.  
  4. SELECT m.FROM, m.TO, count(m.id),m.message, m.date
  5. FROM messages m, users u
  6. WHERE (
  7. `from` = u.id
  8. AND `to` =37
  9. )GROUP BY u.id
  10. UNION SELECT m.FROM, m.TO,count(m.id),m.message, m.date
  11. FROM messages m, users u
  12. WHERE (
  13. `to` = u.id
  14. AND `from` =37
  15. ) GROUP BY u.id
  16. ) AS m


No i wszystko fajnie tylko że pokazuje
FROM TO COUNT
1 37 5
37 1 8

co oznacza że razem wysłanych między nami wiadomości było 13, i to jest właśnie sedno sprawy, chcę uzyskać coś w stylu:

USER ILOSC_WIADOMOSCI
1 13

Myślałem że UNION właśnie zsumuje mi kolumnę count(m.id)

Udało mi się zrobić to w inny sposób

  1. SELECT *
  2. FROM (
  3.  
  4. SELECT m.FROM, m.TO, count( m.id ) AS cc, m.message, m.date
  5. FROM messages m, users u
  6. WHERE (
  7. (
  8. `from` = u.id
  9. AND `to` =37
  10. )
  11. OR (
  12. `to` = u.id
  13. AND `from` =37
  14. )
  15. )
  16. GROUP BY u.id
  17. ) AS m
  18. ORDER BY cc




Teraz żeby wiedzieć, z którym użytkownikiem mam wiadomości należy dodać IF

  1. SELECT *
  2. FROM (
  3.  
  4. SELECT m.FROM, m.TO, count( m.id ) AS cc, m.message, m.date, IF( m.FROM =37, m.TO, m.FROM ) AS userid
  5. FROM messages m, users u
  6. WHERE (
  7. (
  8. `from` = u.id
  9. AND `to` =37
  10. )
  11. OR (
  12. `to` = u.id
  13. AND `from` =37
  14. )
  15. )
  16. GROUP BY u.id
  17. ) AS m
  18. ORDER BY cc



No dobra, doszedłem do czegoś takiego

  1. SELECT count( m.id ) AS cc, IF( m.FROM =37, m.TO, m.FROM ) AS userid
  2. FROM messages m, users u
  3. WHERE (
  4. (
  5. `from` = u.id
  6. AND `to` =37
  7. )
  8. OR (
  9. `to` = u.id
  10. AND `from` =37
  11. )
  12. )
  13. GROUP BY u.id
  14. ORDER BY cc
  15. LIMIT 0 , 30


Otrzymuję tabelę

CC USERID

czyli

ILOŚĆ_WIADOMOŚCI USER

Moje pytanie brzmi jak teraz wyciągnąć inne dane tego użytkownika np imię i nazwisko?

no dobra udało się, jak by ktoś śledził temat to rozwiązaniem jest

  1. SELECT *
  2. FROM (
  3.  
  4. SELECT count( m.id ) AS cc, IF( m.FROM =37, m.TO, m.FROM ) AS userid
  5. FROM messages m, users u
  6. WHERE (
  7. (
  8. `from` = u.id
  9. AND `to` =37
  10. )
  11. OR (
  12. `to` = u.id
  13. AND `from` =37
  14. )
  15. )
  16. GROUP BY u.id
  17. ORDER BY cc
  18. ) AS mm
  19. LEFT JOIN users us ON us.id = userid
  20. LIMIT 0 , 30