Avatar billede tblaster Nybegynder
21. september 2005 - 18:31 Der 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


Håber I kan finde fejlen!
Avatar billede nielle Nybegynder
21. september 2005 - 18:49 #1
Prøv at give et eksempel på hvordan din færdige SQL-sætning kunne se ud når alle de forskellige ting er blevet indsat og replacet.
Avatar billede kjulius Novice
21. september 2005 - 21:44 #2
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
Avatar billede tblaster Nybegynder
22. september 2005 - 22:18 #3
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.
Avatar billede kjulius Novice
22. september 2005 - 22:26 #4
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.
Avatar billede nielle Nybegynder
22. september 2005 - 22:44 #5
Jeg har lidt svært ved at gennemskue din SQL i sin helhed, men er det ikke bare et spørgsmål om at ændre:

S.DataID IS NULL or S.nr <> '3421'

- til:

S.DataID IS NULL and S.nr <> '3421'

- eller hvad?
Avatar billede kjulius Novice
23. september 2005 - 01:25 #6
For nu at teste min teori (for som sagt er det det eneste potentielle problem jeg kan se med din query), så kunne du jo prøve at udskrive følgende:

SELECT * FROM Log WHERE TRIM(nr) <> nr

Det ville give dig de rows, hvor der er blanke i S.nr feltet.

Hvilken database bruger du, forøvrigt?
Avatar billede tblaster Nybegynder
23. september 2005 - 08:24 #7
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.
Avatar billede kjulius Novice
23. september 2005 - 08:43 #8
Din funktion FindIDer, hvad returnerer den?
Avatar billede tblaster Nybegynder
23. september 2005 - 08:48 #9
En stak værdier hvor D.ParentID = et nummer ... jeg ved at den funktion virker for jeg bruger den i andre sammenhæng
Avatar billede kjulius Novice
23. september 2005 - 09:04 #10
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"

Er det rigtigt forstået?
Avatar billede tblaster Nybegynder
23. september 2005 - 09:07 #11
yep
Avatar billede kjulius Novice
23. september 2005 - 09:18 #12
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!"
Avatar billede tblaster Nybegynder
23. september 2005 - 09:28 #13
det er rigtigt ... men jeg har prøvet at sætte en trim på og det gør ingen forskel.
Avatar billede kjulius Novice
23. september 2005 - 10:10 #14
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
Avatar billede tblaster Nybegynder
19. oktober 2005 - 17:51 #15
Det gør stadig ingen forskel.
Avatar billede kjulius Novice
19. oktober 2005 - 23:28 #16
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?
Avatar billede tblaster Nybegynder
20. oktober 2005 - 09:40 #17
Det er sådan sqlen  ser ud når mit script har genereret det. Og S.nr er et tal felt.
Avatar billede kjulius Novice
20. oktober 2005 - 21:44 #18
Hvis S.nr er et talfelt, burde din sammenligning S.nr <> '3421' egentlig ikke virke. Og det gør den måske heller ikke? Det burde vel så hedde:

S.nr <> 3421
Avatar billede tblaster Nybegynder
20. oktober 2005 - 22:09 #19
Har lige checket med databasen ... det er et int(8) felt. Kan fejlen ligge i at jeg bare skal slette de 2 x ' ?

Men sql udtrækket virker jo. Jeg får pt. ingen fejl når jeg køre den.
Avatar billede kjulius Novice
20. oktober 2005 - 22:14 #20
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.
Avatar billede tblaster Nybegynder
20. oktober 2005 - 22:18 #21
Mon ikke den gør det ...
Avatar billede tblaster Nybegynder
24. november 2005 - 19:53 #22
kjulius ... smid et svar og du skal få halvdelen af pointne

Jeg har nu oprettet et nyt spørgsmål, eftersom der er kommet en række nye ting til:
http://www.eksperten.dk/spm/667199
Avatar billede kjulius Novice
24. november 2005 - 21:18 #23
Sure!...
:-)
Avatar billede tblaster Nybegynder
24. november 2005 - 21:45 #24
.
Avatar billede tblaster Nybegynder
24. november 2005 - 21:45 #25
.
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
Kurser inden for grundlæggende programmering

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