27. juni 2004 - 19:28Der 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.
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
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?
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?
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
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.
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 :)
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.
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.
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] } }
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
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 :)
Synes godt om
Ny brugerNybegynder
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.