03. oktober 2011 - 07:45Der er
15 kommentarer og 1 løsning
tricky query
Hey,
hvordan får jeg hentet de sidst behandlede records (kolonnen hedder lastEdited) på 20 forud definerede dage i een enkel query? Det går for langsomt med 20 queries.........
Hvis du vil køre queryen direkte i mysql uden stored procedures kunne du jo sige: SELECT lastEdited FROM mytable WHERE editdate = '2011-10-01' OR editdate = '2011-10-02' OR editdate = ..... for tyve spredte dage. Hvis dagene ligger i rækkefølge kan du bruge ....WHERE editdate BETWEEN '2011-09-01' AND '2011-09-21'. Hvis du kører queryen fra en applikation, for eksempel i php kan du definere de tyve dage i variabler (så kan du også let forandre datoerne hvis nødvendigt), for eksempel således:
Ja, nu er vi tæt på, det var også min tanke, problemet er bare, at der er mange records for hver dag og jeg skal fange den som er behandlet sidst for hver dag. Så queryen skal udbygges en smule. Jeg fik ikke beskrevet det 100% nøjagtigt.
Der er kun een kolonne som er interessant i tabellen, det er lastEdited. Nu sagde jeg jo ikke, at der kun var en record pr dag, det antog du. Men når det kan misforstås, må jeg erkende jeg ikke har beskrevet nøjagtigt nok, men problemet er stadig det samme. Bare bemærk, at der er mange records for hver dag og jeg skal finde den som er blevet behandlet sidst for hver dag på 20 forskellige dage. Jeg vil sætte meget stor pris på din hjælp.
Hvis det kan hjælpe, så er det denne query jeg sender 20 gange nu.
select lastEditedByPhoner from tsubjecthandling where lastEditedByPhoner>'" + dayStart + "' and lastEdited<'" + dayEnd + "' order by lastEdited desc LIMIT 1");
mousedreamer, det vil du ikke være med til (specificere yderligere og vise opbygningen af tabellen.) Jeg kan ikke se, hvad der står i kolonnen lastEdited og hvad datatypen er, og jeg kan ikke se hvor dayStart og dayEnd kommer fra, om det er kolonner i tabellen (og så datatyper) eller det er en slags parameter der kommer et eller andet sted fra. Det kan være det er mig der er for dum. Du må enten 'tale ned' til mit niveau eller håbe på hjælp fra andetsteds.
(#7, var det et løsningsforslag til denne tråd, eller var det en slags nyt spørgsmål? I så fald får du nok mere visibility og derved bedre hjælp, hvis du opretter det formelt som et spørgsmål.)
Christian,jeg forsøger at udelade alt som ikke er relevant især fordi jeg har skrivekrampe. Har Showsource fat i noget her? Kunne godt se sådan ud. Det er lige netop den nyeste for hver dag jeg leder efter. Tester det i aften og vender tilbage. Datatypen er datetime, dayStart og dayEnd er parametre som indeholder det de hedder.
Det var nu et forslag, som jeg ikke helt forstod hvorfor den kun ville vise den første.
#10 vil nok virke hvor alle felter i row hentes. Dog mangler der lige indenfor bestemt dato. Hvis du kun vil ha' dato feltet, kan den med MAX sagtens bruges.
SELECT * FROM datoer WHERE dato IN ( SELECT MAX(dato) FROM datoer WHERE DATE_FORMAT(dato, '%Y-%m-%d') <= $yourdate GROUP BY DATE_FORMAT(dato, '%Y-%m-%d') ) ORDER BY dato DESC LIMIT 20
$yourdate er så den øvre grænse for datoerne i sub selecten. Skulle give de 20 nyeste mindre end eller lig yourdate.
bauer, din løsning virker muligvis, men jeg måtte stoppe den da den ikke svarede efter 2 minutter. Og jeg leder jo efter noget som er hurtigt. Dette er hurtigst i et eksempel med 13 datoer(600 ms):
SELECT max(lastEditedByPhoner) FROM `tsubjecthandling` WHERE substring(lastEditedByPhoner,1,10) = '2011-06-06' or substring(lastEditedByPhoner,1,10) = '2011-06-07' or substring(lastEditedByPhoner,1,10) = '2011-06-08' or substring(lastEditedByPhoner,1,10) = '2011-06-09' or substring(lastEditedByPhoner,1,10) = '2011-06-10' or substring(lastEditedByPhoner,1,10) = '2011-06-11' or substring(lastEditedByPhoner,1,10) = '2011-08-12' or substring(lastEditedByPhoner,1,10) = '2011-08-09' or substring(lastEditedByPhoner,1,10) = '2011-08-10' or substring(lastEditedByPhoner,1,10) = '2011-08-11' or substring(lastEditedByPhoner,1,10) = '2011-08-12' or substring(lastEditedByPhoner,1,10) = '2011-09-09' or substring(lastEditedByPhoner,1,10) = '2011-09-10' or substring(lastEditedByPhoner,1,10) = '2011-09-11' or substring(lastEditedByPhoner,1,10) = '2011-09-12' or substring(lastEditedByPhoner,1,10) = '2011-09-14'
GROUP BY DATE_FORMAT(lastEditedByPhoner, '%Y-%m-%d')
Og jeg synes showsource skal have points for korrekt løsning, men tak til alle som deltog.
Virker perfekt showsource! Hvis nogen mener jeg ikke har beskrevet ufordringen korrekt, vil jeg godt have en personlig mail. Jeg går meget op i at udtrykke mig præcist.
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.