Avatar billede jjmb Nybegynder
14. december 2014 - 20:14 Der er 13 kommentarer og
1 løsning

Hjælp til SELECT

Hej,
Jeg har brugt det meste af dagen på at prøve at løse dette. Nu prøver eg så at søge hjælp her.

Jeg ønsker at sortere en liste efter datestamp hvor message_to er {x} og message_from er {y} eller omvendt.

nedenstående eksempel skal vise række 1 og 4... jeg kender kun til message_to... dvs at message_from skal findes ud fra denne...

message from skal være unik, så der kun vises én samtale med hver person.

Er der nogen der kan hjælpe vil jeg blive meget glad.

Her er en fiddle: http://sqlfiddle.com/#!2/f4b387/1

CREATE TABLE  `messages` (
  `message_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `message_to` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `message_from` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `message_datestamp` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`message_id`),
  KEY `message_datestamp` (`message_datestamp`)
);

INSERT INTO `messages` (
  `message_id`, `message_to`, `message_from`, `message_datestamp`
) VALUES
(1, 2, 1, 1371470000),
(2, 1, 2, 1371460000),
(3, 3, 1, 1366000000),
(4, 1, 3, 1380000000)

SELECT message_id, message_to, message_from, message_datestamp
    FROM messages
    WHERE message_to=1
    GROUP BY message_from ORDER BY message_datestamp DESC
Avatar billede erikjacobsen Ekspert
14. december 2014 - 21:09 #1
Du skal lige være mere præcis!  Er det ikke række 2 og 4, der skal vises? Og hvad skal der ske, hvis der er flere meddelelser, for en given message_to og message_from - hvilken skal så vises.

Den SQL du viser giver nok ingen fejl lige i MySql, men overtræder reglerne omkring GROUP BY. Det er en kendt ... øhm ... facilitet i MySql.
Avatar billede jjmb Nybegynder
14. december 2014 - 21:58 #2
mange tak for du tager dig tid til at svare.
det er ikke række 2, men række 1 der skal vises da datestamp er højere.

Jeg prøver at være så prævis jeg overhovedet kan:)
jeg vil lave en liste med alle de samtaler som en bruger er igang med.

Jeg vil trække det nyeste dastestamp ud fra en samtale mellem message_to og message_from.

message_to er mig selv (eller brugeren selv). og pt virker datestamp ikke hvis jeg selv har skrevet det seneste indlæg....

Giver det nogen mening?
14. december 2014 - 22:09 #3
Ja, før jeg, eller andre, kan begynde at tænke på løsninger, må det være klart, hvad du vil opnå.  Det fremgår ikke tydeligt.  Jeg har kikket på din tekst, og her er et gæt af hvad du vil.

Tabellen viser et antal en-vejs kontakter, såsom sms'er.  Du er interesseret i person nummer 1, og du vil have en liste af de personer som 1 har været i kontakt med.  For hver person, som 1 har været i kontakt med vil du have datestamp for den seneste kontakt, uanset om denne kontakt var fra 1 eller til 1.

Tabellen viser et antal kontakter mellem 1 og 2 - den seneste kontakt er række 1.  Tabellen viser også et antal kontakter mellem 1 og 3, og den seneste kontakt er række 4.  Det er derfor dit forventede resultat er række 1 og 4. 

Har jeg gættet rigtigt?  Du vil selecte de rækker, hvor enten message_to eller message_from er 1 i datestamp  rækkefølge med største først.  For hver 'modpart' vil du så kun have den første, den nyeste, message.

Eller hvad?
14. december 2014 - 22:10 #4
jimb, jer ser, at du kom med et indlæg mens jeg arbejde på mit.  Men det er mig stadig ikke helt tydeligt.  Hvor langt har jeg gættet rigtigt?  kan du rette mig hvor jeg er gået galt i byen?
Avatar billede erikjacobsen Ekspert
14. december 2014 - 22:11 #5
Men række 1 er ikke til nummer 1, men til nummer 2. Eller hva'?
Avatar billede jjmb Nybegynder
14. december 2014 - 22:33 #6
Christian, tak for du også tager dig tid til at hjælpe:)
du er helt med...

jeg søger det nyeste datestamp hvor 1 er i enten message_to eller message_from

erikjacobsen -> nej med række mener jeg msql row... nummer 1 er mit message_to id (mig selv)
Avatar billede erikjacobsen Ekspert
14. december 2014 - 22:45 #7
Det er slet ikke forstået. Prøv at genlæse hvad du skriver, og hvad din kode siger. Jeg hopper af herfra - det er spild af tid, når du ikke kan være præcis.
15. december 2014 - 10:17 #8
erikjacobsen, jeg tror jeg har forstået hvor jjmb vil hen.  Hans kode er helt hen i vejret (undskyld jjmb), og det er meget forvirrende.  Se bort fra koden.  Tabellen viser fire rækker, i de første to har 1 udvekslet beskedder med 2 som 'modpart' og de sidste to har 1 udvekslet beskedder med 3 som modpart.  jjmb vil nu selecte den nyeste række med beskedder mellem 1 og modpart 2, det er række 1, og den nyeste række med beskedder mellem 1 og modpart 3, det er række 4.

Løsningen må dreje sig om først at selecte de rækker hvor enten message_from eller message_to er 1 og sortere de rækker i datestamp rækkefølge med nyeste øverst.  I det fundne resultat skal så kun den første række for hver modpart bruges. 

jjmb, ikke sandt?

Den første del er rimelig nem at kode, SELECT * FROM messages WHERE message_from = 1 OR message_to = 1 ORDER BY message_datestamp DESC

Den anden del, hvor man ud af dette resultat selecter den første forekomst af hver modpart, kan jeg ikke lige gennemskue.  Kan du (eller andre?)
Avatar billede jjmb Nybegynder
15. december 2014 - 10:47 #9
Hej igen.

erikjacobsen-> jeg snes selv det er lidt kryptisk... er ked af jeg ikke kan forklare mig tydeligere. har virkelig forsøgt det bedste jeg kan:)

Christian_Belgien-> yes, du har helt ret.
Har opdateret min fiddle her:
http://sqlfiddle.com/#!2/5d0577/1

Har tilføjet 2 rækker mere, så der er en samtale på 2 indlæg ml bruger 1 og 2, og 4 indlæg ml bruger 1 og 3.

Vi mangler nu kun trække nyeste datestamp ud fra hver samtale.

du skriver at min kode er helt hen i vejret:) Undskyld... Håber at kunne lære af denne tråd:)
16. december 2014 - 21:05 #10
Det er da vel ikke således, at tabellen udelukkende indeholder beskedder mellem dig selv, 1, og andre?  Således at enten message_to eller message_fra vil altid være 1?  I så fald er det selve tabellen du (efter min mening) skal lave om, såsom:

id partner retning datestamp
1      2      s        1371470000
2      2      m      1371460000
3      3      s        1366000000
4      3      m      1380000000

I tabellens første række er samtalepartneren nummer 2 og du har sendt beskedden.  I næste række er samtalepartneren ligeledes nummer 2, men der har du modtaget beskedden.

Hvis du kan stille tabellen således op, så vil du formodenligt kunne få listen over den sidste besked med hver samtalepartner således (ikke testet):

SELECT * FROM messages ORDER BY datestamp DESC GROUP BY partner.
16. december 2014 - 21:12 #11
Hov, den skulle ikke have været sendt, men kun preview'ed.  SELECTEN er nemlig forkert.  Det er for længe siden jeg selv har været rigtig igang med sql. En SQL haj kan ordne det på 30 sekunder.  Det kan være det bliver noget i retning af (stadig ikke testet)

SELECT id, partner, max(datestamp) FROM messages.
Avatar billede jjmb Nybegynder
17. december 2014 - 13:11 #12
Hej Christian,
Det er et internt besked sstem hvor de forskellige brugere skal kunne skrive til hinanden også.

Tænker at hvis dette ikke er muligt, så må jeg lave en tabel mere hvor hver samtale for deres eget thread_id... men snes bare der er en omstændig løsning frem for hvis det kunnes gøres uden en ny tabel:)
17. december 2014 - 20:43 #13
Siger du, at du måske en dag vil have en liste over alle de brugere som for eksempelt nummer 3 har været i kontakt med?  I så fald duer mine forslag ikke.  Jeg er ikke smart nok til at finde ud af, hvordan det kan gøres i sql.  Og dette er nu en halvgammel og en halvlang tråd, som du også begynder med en indviklet forklaring og et misvisende kodeforsøg.  Der kommer nok ikke andre brugere ind nu og kommer med forslag.

Men måske er vejen frem, at du lukker dette spørgsmål (med eget svar) og opretter et nyt, hvor du forklarer sagen mere enkelt.  Såsom at du har en tabel over beskedder mellem personer.  Du har så brug for at kunne vælge en person og så få udskrevet den nyeste besked for hver af de andre som denne person har været i kontakt med. Så kunne du måske vise tabellen simpelt hen som:

id  til        fra    datestamp
1  hans    jens  1371470000
2  jens    hans  1371460000
3  sven    jens  1366000000
4  hans    sven  1380000000

og forklare, at hvis du søger efter jenses kontakter, så er det id1 for hans og id4 for sven der skal vises.
Avatar billede jjmb Nybegynder
21. december 2014 - 12:26 #14
Som Christian skriver så er denne tråd blevet lang og forvirrende, så jeg lukker denne og prøver at oprette en ny simplere tråd:)
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

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