Avatar billede 7th Praktikant
27. juni 2004 - 19:28 Der er 24 kommentarer og
1 løsning

Udtræk efter nyeste dato

Jeg har en poll lokaliseret i to tabeller.

rnb_polls // poll spørgsmål
stamp
poll

rnb_vibes // stemme muligheder
stamp
vibe

Jeg skal så have hjælp til at udtrække den nyeste dato fra rnb_polls, og joine felter fra rnb_vibes hvor rnb_polls.stamp = rnb_vibes.stamp.

Adskilt kan jeg godt få udtrukket den nyeste dato med SELECT * FROM rnb_polls ORDER BY stamp LIMIT 0 , 1.

Jeg kan også godt joine felter med SELECT * FROM rnb_polls LEFT JOIN rnb_vibes ON rnb_polls.stamp = rnb_vibes.stamp ORDER BY rnb_polls.stamp, men det kniber meget når det nu kun er nyeste dato jeg vil have udtrukket efter.

Et tip vil være fint i første omgang, så jeg selv kan prøve mig frem.
Avatar billede dadane Novice
27. juni 2004 - 23:16 #1
Den rigtige måde at få den nyeste dato på er

SELECT MAX(stamp) FROM rnb_polls (evt. SELECT MAX(stamp) AS nyeste FROM rnb_polls)

Jeg tror du skal droppe stjernen og fortælle hvad du ønsker. Dit problem er uden tvivl navnesammenfald.

Brug evt. følgende:

SELECT rnb_polls.stamp AS pollstamp, rnb_vibes.stamp AS vibestamp FROM ...

Hvis du har brug for at udtrække flere ting der hedder det samme.

Håber det hjalp dig lidt videre.
Avatar billede 7th Praktikant
28. juni 2004 - 13:32 #2
Dit MAX(stamp) lader til at være det jeg skal bruge. Prøver lige at lege med det. Der er ingen navnesammenfald udover stamp :)
Avatar billede dadane Novice
28. juni 2004 - 13:39 #3
Men det er også nok.

Du får problemer når du skriver

SELECT * FROM rnb_polls LEFT JOIN rnb_vibes ON rnb_polls.stamp = rnb_vibes.stamp ORDER BY rnb_polls.stamp

Selvom begge stamp er ens vil du få at vide at stamp er tvetydigt. Hvis du istedet skriver SELECT rnb_polls.stamp AS st1, rnb_polls.ANDET_FELT, ..., rnb_vibes.FELT1, ... FROM rnb_polls LEFT JOIN rnb_vibes ON rnb_polls.stamp = rnb_vibes.stamp ORDER BY rnb_polls.stamp så skulle du nok kunne få det til at virke
Avatar billede 7th Praktikant
28. juni 2004 - 14:07 #4
Når jeg gør således...

SELECT rnb_polls.stamp , rnb_vibes.stamp , poll , vibe , MAX(rnb_polls.stamp) FROM rnb_polls LEFT JOIN rnb_vibes ON rnb_polls.stamp = rnb_vibes.stamp GROUP BY rnb_vibes.stamp

så får jeg godt nok noget med den nyeste dato, men ikke helt efter min hensigt.

rnb_polls // poll spørgsmål indeholder...
* * * * * * * * * *
stamp | 2004-06-27
poll | Test et poll spørgsmål
* * * * * * * * * *
stamp | 2004-06-26
poll | Hvem har den bedste vokal?

- - - - - - - - - -

rnb_vibes // stemme muligheder indeholder...
* * * * * * * * * *
stamp | 2004-06-27
vibe | mulighed option 1
* * * * * * * * * *
stamp | 2004-06-27
vibe | mulighed option 2
* * * * * * * * * *
stamp | 2004-06-27
vibe | mulighed option 3
* * * * * * * * * *
stamp | 2004-06-26
vibe | mulighed option 0

Min hensigt er så at udtrække den nyeste dato fra rnb_poll...

stamp | 2004-06-27
poll | Test et poll spørgsmål

og stamp der matcher denne fra rnb_vibes

stamp | 2004-06-27
vibe | mulighed option 1
* * * * * * * * * *
stamp | 2004-06-27
vibe | mulighed option 2
* * * * * * * * * *
stamp | 2004-06-27
vibe | mulighed option 3

Med min select får jeg dog (se heeelt øverst)...

stamp | 2004-06-26
poll | Hvem har den bedste vokal?

som jo ikke er den nyeste dato, samt...

stamp | 2004-06-27
vibe | mulighed option 1
* * * * * * * * * *
stamp | 2004-06-26
vibe | mulighed option 0

som jeg ikke kan forklare hvorfor netop disse udtrækkes :) Der står ikke ret meget om MAX() på mysql.com, men udtrækker MAX() blot éen enkelt række for hver stamp?
Avatar billede dadane Novice
28. juni 2004 - 15:24 #5
Ja. Hvis du bruger MAX for du kun en enkelt række for hver gruppe.

Du kan f.eks. skrive

SELECT erhverv, MAX(alder) FROM personer GROUP BY erhverv

Det vil så måske give

Bagere 62
Købmænd 47
Pensionister 89
Lærer 55

Eller noget. - Altså den højeste alder for hver af grupperne.
Avatar billede dadane Novice
28. juni 2004 - 15:25 #6
Hvis du ikke har nogen GROUP BY får du bare en gruppe. - Dvs. så får du den højeste alder af dem alle.
Avatar billede dadane Novice
28. juni 2004 - 15:27 #7
Mon ikke du skal lave en GROUP BY poll?
Avatar billede dadane Novice
28. juni 2004 - 15:28 #8
Evt. GROUP BY poll, vibe

Kan ikke lige helt overskue din database.
Avatar billede 7th Praktikant
28. juni 2004 - 15:35 #9
OK tak :)

Hmm, dit MAX() tip er både/og :) Det vil sige, jeg kan godt få det til at gøre halvdelen af hvad jeg gerne vil have udtrukket, resten glipper dog, da MAX(), som du siger, kun viser en enkelt række for en gruppe.

Jeg ved godt mit forrige eksempel ikke var ret optimalt og overskuelig, men følgende som jeg har lavet på to linie, skulle jeg gerne have udtrykt på en linie, hvis det kan lade sig gøre.

$max = mysql_result (mysql_query ("SELECT DATE_FORMAT(MAX(stamp) , \"%Y%m%d\") date FROM rnb_polls") , 0 , "date"); // udtræk nyeste dato i format år måned dag

$sql = mysql_query ("SELECT poll , vibe FROM rnb_polls , rnb_vibes WHERE rnb_polls.stamp = ".$max." AND rnb_vibes.stamp = ".$max."") or die ("Query can not be executed. ".mysql_error()."."); // udtræk fra rnb_polls og rnb_vibes hvor deres stamp er lig $max
Avatar billede dadane Novice
28. juni 2004 - 15:48 #10
SELECT poll , vibe
FROM rnb_polls
  INNER JOIN rnb_vibes ON rnb_vibes.stamp=rnb_polls.stamp
ORDER BY rnb_vibes.stamp DESC
LIMIT 0 , 1
Avatar billede dadane Novice
28. juni 2004 - 15:51 #11
Iøvrigt - det er en god ide at minimere din SQL forespørgsler, - men en fra eller til sker der ikke noget ved. Det du skal undgå er at neste dem. Altså

$sql = "SELECT navn FROM ..."

  $sql2 = "SELECT alder FROM ... WHERE navn=" . $row['navn']

For der kan du jo ende med at sende endda rigtigt mange SQL forespørgsler af sted i fra en enkelt side. Og det vil koste performance.
Avatar billede 7th Praktikant
28. juni 2004 - 16:13 #12
Jep ok :)

Din sidste select er næsten komplet. Eneste minus er, at der jo kan være flere felter af vibe med ens stamp, altså dato. Så duer LIMIT 0 , 1 ikke, da jeg gerne vil have alle vibe frem hvor rnb_vibes.stamp = rnb_polls.stamp, og hvor rnb_polls.stamp kun må være nyeste dato. Håber du forstår min galskab :)
Avatar billede dadane Novice
28. juni 2004 - 16:21 #13
Så drop LIMIT 0,1 og i din while løkke tjekker du hvornår stamp ændre sig.
Avatar billede 7th Praktikant
28. juni 2004 - 16:47 #14
Tjooo, men så går det sjove ligesom af det her :)

Er denne query...

SELECT poll , vibe , MAX(rnb_polls.stamp) date FROM rnb_polls , rnb_vibes GROUP BY vibe HAVING rnb_vibes.stamp = date

lig med...

VÆLG poll , vibe , MAX(rnb_polls.stamp) date FRA rnb_polls , rnb_vibes SOM HAR rnb_vibes.stamp = date

eller er det helt hen i vejret? Den giver ihvertfald ingenting.
Avatar billede dadane Novice
28. juni 2004 - 16:54 #15
1) Nej det sjove går ikke af. Du har stadig kun én SQL forespørgsel og du fetcher kun de data du har brug for (+1 række). Det er yderst effektivt!

2)
SELECT poll , vibe , MAX(rnb_polls.stamp) date FROM rnb_polls , rnb_vibes GROUP BY vibe HAVING rnb_vibes.stamp = date
Har vidst en fejl. Burdu du ikke have en AS mellem MAX(rnb_polls.stamp) og date?

Hvis du retter det skulle du gerne få noget resultat.
Og du vil så se at det ikke er det samme.

Får date vælges i hver række. Altså du gruppere efter vibe. Så for hver eneste vibe værdi vil den finde den maksimale dato. Du vil altså få alt for mange resultater.
Avatar billede 7th Praktikant
28. juni 2004 - 17:01 #16
1) OK, fik ikke testet ordentligt så. Jeg mente ellers bare at jeg fik alle poll fra rbn_polls ud. Kigger lige igen.

2) Der står på mysql.com at AS er optional. OK, det havde jeg misforstået så.
Avatar billede dadane Novice
28. juni 2004 - 17:03 #17
Ang. AS - det er muligt du har ret. Men så må du have en anden fejl. Du burde få en masse data ud. (Eller også har jeg overset/misforstået noget)
Avatar billede dadane Novice
28. juni 2004 - 17:05 #18
Ang. data - ja. Hvis du bare fetcher løs på:

SELECT poll , vibe
FROM rnb_polls
  INNER JOIN rnb_vibes ON rnb_vibes.stamp=rnb_polls.stamp
ORDER BY rnb_vibes.stamp DESC

så får du alt for meget. Men du skal jo bare stoppe mens legen er god ;)
Avatar billede 7th Praktikant
28. juni 2004 - 17:43 #19
Bare og bare er så meget sagt :) Jeg synes det er ret besværligt, at skulle gå et skidt tilbage hele tiden for at tjekke om stamp matcher eller ikke, så lige nu holder jeg mig til...

$max = mysql_result (mysql_query ("SELECT MAX(DATE_FORMAT(stamp , \"%Y%m%d\")) date FROM rnb_polls") , 0 , "date");

$sql = mysql_query ("SELECT rnb_polls.stamp AS poll_date , poll , vibe FROM rnb_polls , rnb_vibes WHERE rnb_polls.stamp = ".$max." AND rnb_vibes.stamp = ".$max." ORDER BY vibe") or die ("Query can not be executed. ".mysql_error().".");

Det er lettest :) Når jeg har spist vil jeg dog prøve påny, og har sikkert et eller to spørgsmål. Du kan dog lige så godt smide et svar nu.
Avatar billede dadane Novice
28. juni 2004 - 17:57 #20
Nej det er ikke så besværligt endda.

$row = mysql_fetch_array($result);
$ostamp = $row['stamp'];

[Gør hvad du skal gøre med den første række]

while ($row = mysql_fetch_array($result) && row['stamp']=$ostamp) {
  if (row['stamp']=$ostamp) {
    [Gør hvad der skal gøres med de efterfølgende rækker]
  }
}
Avatar billede dadane Novice
28. juni 2004 - 17:57 #21
Et svar
Avatar billede dadane Novice
28. juni 2004 - 17:58 #22
Du skal så lige ændre:

SELECT poll , vibe
FROM rnb_polls
  INNER JOIN rnb_vibes ON rnb_vibes.stamp=rnb_polls.stamp
ORDER BY rnb_vibes.stamp DESC

til:

SELECT poll, vibe, rnb_vibes.stamp
FROM rnb_polls
  INNER JOIN rnb_vibes ON rnb_vibes.stamp=rnb_polls.stamp
ORDER BY rnb_vibes.stamp DESC
Avatar billede 7th Praktikant
28. juni 2004 - 18:22 #23
Hmmm trænger til en pause... Svarer nok først tilbage i morgen. Håber det er ok :)
Avatar billede 7th Praktikant
29. juni 2004 - 02:29 #24
Dit forslag er ikke helt optimalt, da...

$row = mysql_fetch_array($result);
$ostamp = $row['stamp'];

automatisk fjerner første record fra query'en :) Efter at have sovet lidt på det, lavede jeg lidt om på det. Hvad jeg/vi vil have er jo blot i første omgang nyeste dato, som vi så kan bruge til at sortere efter.

SELECT poll , rnb_vibes.stamp AS vibe_stamp , vibe , MAX(rnb_polls.stamp) AS poll_date FROM rnb_polls , rnb_vibes GROUP BY vibe

$max = mysql_result ($sql , 0 , "poll_date");

echo mysql_result ($sql , 0 , "poll");

while ($row = mysql_fetch_array ($sql))
{
    echo $row['vibe_stamp'] == $max ? $row['vibe_stamp']." | ".$row['vibe'] : false;
}

Så får jeg de fineste resultater frem :) Jeg tror det er den nemmeste måde at gøre det på, så jeg siger mange tak for dine fine og gode hjælp :)
Avatar billede 7th Praktikant
29. juni 2004 - 05:54 #25
Det er noget skidt jeg har rodet mig ud i. Legede lidt med felterne i databasen, og der er ret umuligt at få udtrukket den nyeste date samt dertilhørende poll og vibe, hvis de ikke er placeret korrekt efter dato sortering.

Jeg har i stedet for lavet om på tabelstrukturen, så jeg nu kun arbejder med en tabel med følgende felter.

id , stamp , options , poll // hvor options er et base64 encoded serialized array indeholdende de forskellige stemmemuligheder samt antal placerede stemmer. Håber det måske kan hjælpe andre som skulle læse mit spørgsmål :)
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
Computerworld tilbyder specialiserede kurser i database-management

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

IT-JOB

Politiets Efterretningstjeneste

Fullstack softwareudvikler i PET

Ingeniørforeningen, IDA

Platform Engineer i IDA

Unik System Design A/S

QA Engineer