Avatar billede mousedreamer Nybegynder
03. oktober 2011 - 07:45 Der 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.........
03. oktober 2011 - 08:33 #1
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:

<?php
$date1 = '2011-08-01';
$date2 = '2011-09-01';
o.s.v.
$datestring = "WHERE editdate = $date1 OR editdate = $date2 OR ...";
$querystring = "SELECT lastEdited FROM mytable " . $datestring;
$result = mysql_query($querystring);
?>
Avatar billede mousedreamer Nybegynder
03. oktober 2011 - 09:39 #2
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.
03. oktober 2011 - 09:47 #3
Jamen så gør det (beskrive problemet nøjagtigt) herunder vis opbygningen af den tabel du queryer.
Avatar billede mousedreamer Nybegynder
03. oktober 2011 - 10:07 #4
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.
Avatar billede mousedreamer Nybegynder
03. oktober 2011 - 10:15 #5
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");
Avatar billede mousedreamer Nybegynder
03. oktober 2011 - 10:16 #6
argh der skulle stå

select lastEdited from tsubjecthandling where lastEdited>'" + dayStart + "' and lastEdited<'" + dayEnd + "' order by lastEdited desc LIMIT 1");
Avatar billede showsource Seniormester
03. oktober 2011 - 10:33 #7
Der er noget jeg ikke helt fatter:
Har en tabel med id og dato
Dato er et datetime felt

Med flg.

SELECT * FROM datoer WHERE dato BETWEEN '2011-10-01' AND '2011-10-05' GROUP BY DATE_FORMAT(dato, '%Y-%m-%d') ORDER BY dato DESC

finder den første record for hver dag.

Med

SELECT MAX(dato) FROM datoer WHERE dato BETWEEN '2011-10-01' AND '2011-10-05' GROUP BY DATE_FORMAT(dato, '%Y-%m-%d')

får jeg nyeste tid for hver dag ???
03. oktober 2011 - 11:07 #8
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.)
Avatar billede mousedreamer Nybegynder
03. oktober 2011 - 12:27 #9
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.
Avatar billede bauerdata Nybegynder
03. oktober 2011 - 12:44 #10
SELECT *
FROM datoer·
WHERE dato IN (
  SELECT MAX(dato)
  FROM datoer
  GROUP BY DATE_FORMAT(dato, '%Y-%m-%d')
)
ORDER BY dato DESC
LIMIT 20
Avatar billede showsource Seniormester
03. oktober 2011 - 13:43 #11
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.
Avatar billede bauerdata Nybegynder
03. oktober 2011 - 16:21 #12
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.
Avatar billede mousedreamer Nybegynder
03. oktober 2011 - 20:45 #13
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.
Avatar billede bauerdata Nybegynder
04. oktober 2011 - 04:42 #14
Så begræns subselecten med denne her
WHERE dato BETWEEN '2011-10-01' AND '2011-10-05'
Avatar billede showsource Seniormester
05. oktober 2011 - 10:10 #15
Skulle du kun ha' det nyeste tid og ikke andre felter?
Så er denne jo fin nok:

SELECT MAX(dato) FROM datoer WHERE dato BETWEEN '2011-10-01' AND '2011-10-05' GROUP BY DATE_FORMAT(dato, '%Y-%m-%d')
Avatar billede mousedreamer Nybegynder
05. oktober 2011 - 15:36 #16
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.
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