21. september 2005 - 18:31Der er
23 kommentarer og 2 løsninger
Sql udtræk skal hente specifikke poster ud
Hejsa
Jeg har følgende sql script som trækker en tilfældig post ud som et nummer ikke har fået før. Mit problem er bare at udtrækket stadig tager poster ud som nummeret har fået før, altså hvor: S.nr = " & RQ_nr & "
Hvis det ikke er nok for jeg bare at se nedenstående sql, så lad mig høre hvad I har brug for så skal jeg nok skrive det, men kort fortalt så skal scriptet trække 50 poster ud og sorter dem efter højeste point antal (hvor D.Score/D.Stemmer = Point antal). Der er følgende krav til posten: 1. Den må ikke være sendt til numeret før. 2. Den skal have en længde på under MsgLength 3. Den skal tilhøre en af følgende kategorier: (D.ParentID = 0 " & Replace(FindIDer 13), "ParentID", "D.ParentID") & ")
SELECT* from (SELECT D.Tekst, D.ID, D.Score/D.Stemmer as Point FROM Data D LEFT JOIN log S ON D.ID = S.DataID Where (S.DataID IS NULL or S.nr <>'" & RQ_nr & "') and LENGTH(D.Tekst) < " & MsgLength &" and (D.ParentID = 0 " & Replace(FindIDer(13), "ParentID", "D.ParentID") & ") Order By RAND() Limit 50) as tmpTable order by Point desc
Umiddelbart kan jeg ikke se, hvordan du kan få rows med S.nr = RQ_nr. Men du ku' prøve med en Trim på hvis der nu skulle være nogle blanke, som forvirrer billedet:
SELECT* from (SELECT D.Tekst, D.ID, D.Score/D.Stemmer as Point FROM Data D LEFT JOIN log S ON D.ID = S.DataID Where (S.DataID IS NULL or Trim(S.nr) <>'" & Trim(RQ_nr) & "') and LENGTH(D.Tekst) < " & MsgLength &" and (D.ParentID = 0 " & Replace(FindIDer(13), "ParentID", "D.ParentID") & ") Order By RAND() Limit 50) as tmpTable order by Point desc
Eks på færdig sql: SELECT * from (SELECT D.Tekst, D.ID, D.Score/D.Stemmer as Point FROM Data D LEFT JOIN log S ON D.ID = S.DataID Where (S.DataID IS NULL or S.nr <> '3421') and LENGTH(D.Tekst) < 200 and (D.ParentID = 0 Or D.ParentID = 10) Order By RAND() Limit 50) as tmpTable order by Point desc
Og meningen er netop at jeg aldrig får en post ud hvor S.nr = RQ_nr. Og hvad mener du med trim? Jeg er sikker på at der er indhold i de variable jeg bruger.
Det jeg tænkte på med brugen af trim var, hvis dit S.nr felt f.eks. indeholdt en værdi på ' 3421'. Så ville den jo ikke være lig med '3421', selv om den jo nok for alm. "tænkende" individer ville forekomme at være ens. Men den foranstående blanke karakter kunne bevirke, at SQL ville opfatte det anderledes. Det kunne du komme ud over ved at anvende Trim funktionen som jeg viste ovenfor.
Mht trim, så er jeg sikker på det ikke er nødvendigt. Alt data checkes for fejl inden det lagres i databasen.
Og mht at ændre or til and så vil det ikke virke. Årsagen er at hvis et nummer har modtaget en post, så logges dette i log tabellen. Så derfor må jeg gå udfra at alle de poster der ikke har nogen relation i log tabellen eller hvor nummeret ikke er lig nr af de poster der ligger i log tabellen, må være poster som nummeret ikke har modtaget før.
Det hele funger på følgende måde: 1. Der vises en post i et system der har et given nummer (RQ_nr). Når posten vises gemmes der en information i log tabellen om at den given post er blevt vist i det given system. 2. Når systemet så skal have vist en ny post, skal den hente en post ud der opfylder følgende: a. Den må ikke være vist i det pågælgende system før b. Den skal have en længde på under MsgLength: LENGTH(D.Tekst) < " & MsgLength &" c. Den skal tilhøre en bestemt kategori som opfyldes vha følgende: (D.ParentID = 0 " & Replace(FindIDer 13), "ParentID", "D.ParentID") & ") d. Udtrækket skal trække 50 tilfældige poster ud og så sorter dem efter score
Databasens opbygning er som følgende: Data - indeholder alt information om en post: Tekst, ID, Score, Stemmer) Log - indeholder en relation til data tabellen hvor der er følgende: DataID (som tilknyttes ID feltet i data tabellen), Nr.
Håber det er beskrivelse nok til at I kan gennemskue hvad der evt er lavet forkert, eller at I måske kan sætte et nyt udtræk sammen. Og min database er en MySQL 4.1.9.
Alt, hvis jeg har forstået det rigtigt (lang fra sikkert :-)), så returnerer din funktion FindIDer(3) f.eks.: "or ParentID=17 or ParentID=30 or ParentID=42"
Mht. Trim, så er det farligt bare at antage (= være sikker på), at værdierne i databasen svarer til det man forventer. Som min chef altid siger: "At stole på er godt, kontrol er bedre!"
Hvad hvis du flytter testen på S.nr op på LEFT JOINs ON statement:
SELECT* from (SELECT D.Tekst, D.ID, D.Score/D.Stemmer as Point FROM Data D LEFT JOIN log S ON D.ID = S.DataID AND S.nr <>'" & RQ_nr & "'" Where LENGTH(D.Tekst) < " & MsgLength &" and (D.ParentID = 0 " & Replace(FindIDer(13), "ParentID", "D.ParentID") & ") Order By RAND() Limit 50) as tmpTable order by Point desc
Det eksempel på en SQL du angiver i din kommentar 22/09-2005 22:18:59, er det en SQL som er genereret af dit script, eller er det en "ønskeSQL", altså en SQL som du ønsker den skal se ud?
Jeg har stadig svært ved at se, hvor det går galt hvis det virkelig er sådan den reelle SQL der bliver udført ser ud. Derfor dette ønske om verificering. S.nr er f.eks. et alpha-felt?
Ja, det vil jeg mene lyder sandsynligt. Men jeg kan som du heller ikke forstå, at den kan køre, med mindre MySQL explicit foretager en konvertering for at kunne sammenligne.
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.