Avatar billede berner5300 Nybegynder
25. oktober 2011 - 18:08 Der er 24 kommentarer og
1 løsning

Problem med sql/php

Hej alle

Jeg er igang med et lille mail system, hvor man logger ind og kan skrive til alle brugere. :)

Lige nu henter jeg bare mailene ud af mysql, og det ser sådan her ud http://offlines.dk/mail.png

Nu vil jeg gerne have lavet på forsiden af mail siden, at hvis en person har skrevet til en anden person to gange, at den person der skrev kun står der en gang og viser den seneste besked, se her.
http://offlines.dk/mailw.png

Er der nogen der ved hvordan dette kan gøres??
Avatar billede The_Buzz Novice
25. oktober 2011 - 18:13 #1
SELECT mail from mailsystem where user=1 LIMIT 1

LIMIT 1 er svaret
Avatar billede The_Buzz Novice
25. oktober 2011 - 18:14 #2
SELECT mail from mailsystem where user=1 order by date LIMIT 1
Avatar billede berner5300 Nybegynder
25. oktober 2011 - 18:15 #3
Jaah, det er rigtigt nok, men nu kommer der også fra flere brugere ;)
Hvad kan man gøre der?

Min database ser sådan her ud:
id
to_id
from_id
not_read
message
date
Avatar billede olebole Juniormester
25. oktober 2011 - 18:15 #4
<ole>

Du skal nok gøre noget andet, end du gør i dag. Det er næsten umuligt at komme med ændringsforslag til en applikation, man intet ved om  =)

/mvh
</bole>
Avatar billede berner5300 Nybegynder
25. oktober 2011 - 18:18 #5
Hvad snakker du om olebole?
Avatar billede olebole Juniormester
25. oktober 2011 - 18:22 #6
Jeg 'snakker' ikke! Vi kender ikke noget til applikationen, og så er det jo svært at gætte, hvad der skal ske.

Hvad er det, du lister på 'forsiden af mail siden'? Er det både læste og ulæste mails - eller kun ulæste? Hvis jeg sendte dig en mail for længe siden, hvad sker der så?
Avatar billede berner5300 Nybegynder
25. oktober 2011 - 18:25 #7
Det jeg har lavet er en side hvor man logger ind og kan skrive mails til hinanden. Når man skriver til en person kommer det op på deres forside af mail siden. Når man så åbner den, så kommer man ind på en siden for den person som sendte beskeden, og der kan man se alle beskeder personen har sendt, og modtaget.
På forsiden skal der så stå navnet på den man har modtaget en mail fra, og den nyeste besked fra personen.

Er der mere du skal vide? :)
Avatar billede olebole Juniormester
25. oktober 2011 - 18:49 #8
Undskyld, men jeg forstår ikke din forklaring
Avatar billede berner5300 Nybegynder
25. oktober 2011 - 18:51 #9
Kan du ikke skrive det du forstår så ;)
Avatar billede iver_mo Nybegynder
25. oktober 2011 - 19:37 #10
Som jeg forstår det, vil han gerne præsentere brugeren får den seneste mail han har modtaget fra hver afsender

Læs linket:
http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

Giver en god udførlig forklaring.
Avatar billede berner5300 Nybegynder
25. oktober 2011 - 19:45 #11
iver_mo
Det ligner lige det jeg skal bruge ;)

Men har så et andet problem, for skal jo finde den sidste mail, og jeg har allerede denne kode:
SELECT *, user.id AS nid FROM user INNER JOIN mail WHERE mail.to_id = user.id AND mail.not_read = 0 ORDER BY user.id DESC

Hvordan får jeg så sat den og en, fra den side du linker til, sammen??
Avatar billede iver_mo Nybegynder
25. oktober 2011 - 19:48 #12
SELECT f.id, f.to_id, f.from_id, f.not_read, f.message, f,date
FROM
(
SELECT from_id, max(date) as maxdate
FROM ditTabelNavn
GROUP BY maxdate
)
AS x INNER JOIN ditTabelNavn AS f ON
f.from_id = x.from_id
AND
f.date = x.maxdate;
Avatar billede berner5300 Nybegynder
25. oktober 2011 - 19:49 #13
Hvad er de der f. foran alle sammen ?
Avatar billede olebole Juniormester
25. oktober 2011 - 19:56 #14
f er tabelnavnet
Avatar billede iver_mo Nybegynder
25. oktober 2011 - 19:59 #15
Hvis der er problemer med max(date) så brug max(id) i stedet, da højeste id altid bør være nyeste... tænker jeg.

Hvis jeg skal lave hele den select statement, skal jeg bruge en export af de 2 tabeller, da jeg ikke er skarp nok til at skrive det ud i det fri og da jeg er for doven til at bygge strukturen + testindhold :-)

Men prøv dig frem i stedet. Jeg er sikker på hvis du google'r "sql mutiple innerjoins and where" så finder du hurtigt noget godt.
Avatar billede berner5300 Nybegynder
25. oktober 2011 - 20:05 #16
Altså vil du se mine tabeller?
Avatar billede iver_mo Nybegynder
25. oktober 2011 - 20:51 #17
Jeg vil helst have, at du selv laver det ;-)

Dernæst vil jeg gerne lave det hvis du laver en export af de 2 relevante MySQL tabeller. De skal sendes på mail, så jeg kan importere dem ind i min DB.
Avatar billede berner5300 Nybegynder
25. oktober 2011 - 21:00 #18
Jamen jeg har siddet de sidste 3 dage og prøvet, men kan virkelig ikke :(

Og hvad mail vil du have det på så ;)
Avatar billede iver_mo Nybegynder
26. oktober 2011 - 08:42 #19
kvantefysik@hotmail
Avatar billede iver_mo Nybegynder
26. oktober 2011 - 13:17 #20
kommer der en mail?
Avatar billede berner5300 Nybegynder
26. oktober 2011 - 14:17 #21
Har sendt en til dig :)
Avatar billede iver_mo Nybegynder
26. oktober 2011 - 23:08 #22
Så vidt jeg kan se, kan det gøres meget mere simpelt:


SELECT *, max(m.date) as maxdate
FROM test.mail as m, test.user as u
WHERE m.to_id = u.id
GROUP BY from_id
ORDER BY maxdate


Ovenstående giver dig den seneste mail fra hver afsender, sorteret med den nyeste mails øverst. Så langt så godt.

I den join statement du skrev angiver du mail.not_read = 0, hvilket jeg ikke helt forstår... mail.not_read = 0 må betyde de mails er læst. not_read = 1 = ikke læst mail. not_read = 0 = læst mail? Jeg tror du har gjort det modsat, da det giver mere mening for hvad du vil på forsiden... tænker jeg :-)

Hvad betyder dette not_read? Vil du vise de seneste mails pr. afsender som ikke allerede er læst? Hvis alle mails for en afsender er læst, vil du så ikke vise noget for den bruger?
Avatar billede iver_mo Nybegynder
26. oktober 2011 - 23:14 #23
Er der tale om at du vil vise den seneste ikke læste besked pr. afsender eller blot den seneste?
Avatar billede iver_mo Nybegynder
26. oktober 2011 - 23:53 #24
Så kom vi vist i mål:

<?php
$userid = 7;// id for den bruger der er logget ind
function db_connect(){
    mysql_connect("localhost", "user", "password") or die(mysql_error());
    mysql_select_db("test") or die(mysql_error());
}
db_connect();
$result = mysql_query("
                        SELECT * , MAX( m.date ) AS maxdate
                        FROM test.mail AS m, test.user AS u
                        WHERE m.to_id = u.id
                        AND m.not_read = 0
                        AND u.id = ".$userid."
                        GROUP BY from_id
                        ORDER BY maxdate DESC
                                            ")or die(mysql_error());

while($row = mysql_fetch_array($result)){
    echo $row['message'].'<br />'; 
}
?>


Sæt m.not_read = 0 eller 1 alt efter om det skal være seneste læste eller ulæste. Skal det bare være den seneste fjerner du bare linien: AND m.not_read = 0.

Jeg tillader mig at smide dette som et svar :-)
Avatar billede berner5300 Nybegynder
27. oktober 2011 - 10:58 #25
Mange tak for hjælpen iver_mo. Det kom til at virke, og du har selvfølgelig fået point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester