Avatar billede jeffe Nybegynder
09. oktober 2003 - 09:33 Der er 16 kommentarer og
1 løsning

MySQL Query

Jeg har denne sætning:
sql = "SELECT * FROM spms, svar WHERE spms.spmid = svar.spmid and spms.kategoriid = '" & kategoriid & "' AND svar.brugerid = '" & session("brugerid") & "'"
og den virker fint.
Men det er sådan ikke det jeg skal bruge. Jeg skal have vendt svar.brugerid = '" & session("brugerid") & "'" om, så den tager alle hvor dette IKKE er opfyldt. Normalt skriver man vel bare AND NOT eller bruger <> og jeg har prøvet begge dele. Problemet er bare at så kommer der ingen records ud. Selvom der burde.
Jeg ved ikke om det er nødvendigt med forklaringer af tabellerne, men så må i lige skrive :D
Avatar billede websmith Nybegynder
09. oktober 2003 - 09:36 #1
Du kan vist bruge IS NULL

Dvs.

"select * form spms, svar where spms.spmid=svar.smpid and spms.karegoriid='" & kategoriid & "' and svar.brugerid IS NULL"

eller måske

"select * form spms, svar where spms.spmid=svar.smpid and spms.karegoriid='" & kategoriid & "' and svar.brugerid=NULL"
Avatar billede jeffe Nybegynder
09. oktober 2003 - 09:36 #2
Ok, nu har jeg da fundet ud af det halvt. Det er ikke i orden, hvis der bare ikke er nogle records...der skal være mindst én der så bare ikke opfylder kravene. Hvordan kommer jeg uden om det?
Ellers bliver det sådan at i quizzen (øh, det er en quiz) at der ikke er nogle der kan være den første til at svare på et spørgsmål, men så snart én har afgivet svar, kan alle...
Avatar billede jeffe Nybegynder
09. oktober 2003 - 09:37 #3
Jeg prøver lige at fumle lidt med det...
Avatar billede arne_v Ekspert
09. oktober 2003 - 09:39 #4
=NULL finder aldrig noget !

IS NULL er den korrekte måde at teste for det.
Avatar billede jeffe Nybegynder
09. oktober 2003 - 09:40 #5
Eller nej, jeg kan da ikke bruge det som der står der. Det skal jo ikke være sådan, at hvis en anden har svaret, så kan vedkommende ikke. Det skal være sådan at hvis der ingen record i svar er, hvor vedkommendes brugerid er i samme record som spørgsmålsid, kan vedkommende svare. Men hvis der er lavet en record med vedkommende brugerid og tilsvarende spmid, har brugeren jo afgivet svar...
Avatar billede arne_v Ekspert
09. oktober 2003 - 09:41 #6
Normal skal man skifte fra:
  = AND =
til:
  <> OR <>
for at få det modsatte.
Avatar billede arne_v Ekspert
09. oktober 2003 - 09:42 #7
Du har i virkeligheden brug for en sub query.

Men medmindre du leger med MySQL 4.1 så kan du ikke bruge det.
Avatar billede jeffe Nybegynder
09. oktober 2003 - 09:43 #8
arne: Jeg forstår ikke hvorfor du skriver det sådan (sikkert mig der er dum), men vil den i givet fald tage dem hvor der slet ikke svar er afgivet?
Avatar billede jeffe Nybegynder
09. oktober 2003 - 09:44 #9
Det er MySQL 3
Avatar billede jeffe Nybegynder
09. oktober 2003 - 09:46 #10
Men det er jo så også fordi jeg sætter spms.spmid = svar.spmid
Det gør jo at der skal findes et svar for det givne spørgsmål. Hvilket der jo så ikke gør, hvis det er nyt.
Hvordan kan jeg undgå det. Dvs. lave den så jeg kan sammenligne dem som nu, men hvis der intet er afgivet, skal det stadig med
Avatar billede arne_v Ekspert
09. oktober 2003 - 09:51 #11
Med subqueries kan du lave:

SELECT * FROM spms
WHERE kategoriid=X AND spmid NOT IN
(SELECT spms.spmid FROM spms,svar WHERE spms.spmid = svar.spmid AND
kategoriid=X AND svar.brugerid=Y)
Avatar billede arne_v Ekspert
09. oktober 2003 - 09:52 #12
Jeg skriver det fordi måske kan tanke-gangen hjælpe en mere MySQL
kyndig end mig til at omformulere det til MySQL SQL.
Avatar billede jeffe Nybegynder
09. oktober 2003 - 09:53 #13
spmid NOT IN
Hvad vil dette gøre helt præcist ?
Virker ellers som noget der kan løse problemet. Anede ikke man kunne lave subs på den måde
Avatar billede websmith Nybegynder
09. oktober 2003 - 10:12 #14
på "rigtige" databaser kan man bruge sub selects. MySQL er stadigvæk et nyt produkt i forhold til mange af de andre databaser, men med tiden bliver MySQL sikkert lige så avanceret som de andre.

Hvis man kigger i "manualen" på www.mysql.com, så kan man se at de forslår at man omkoder sub selects til left joins.

Jeg har tidligere gjort det ved at bruge den samme tabel med forskellige alias, dvs.

"select * from svar s1, svar s2, spms sm1
left join s2 on s1.spmid=s2.spmid
where s2.spmid is null and sm1.spmid=s1.spmid and sm1.kategoriid='" & kategoriid & "' and s1.brugerid='" & session("brugerid") & "'"

Noget ala dette.
Avatar billede websmith Nybegynder
09. oktober 2003 - 10:15 #15
Humlen er at man vil have alle records som ikke allerede har et svar. Dette kan man normalt kun gøre med en sub select, eller left joins. Men når det er en tabel man vil joine med sig selv, så er man nødt til at bruge alias'er.

Det kan godt være at mit eksempel ovenfor ikke er 100% korrekt, men jeg håber at det giver lidt inspiration til hvordan det kan løses
Avatar billede jeffe Nybegynder
09. oktober 2003 - 10:16 #16
Hmm, den skriver ved denne sætning at s2 aliasset ikke er unikt !
Kan du se hvorfor det?
Jeg kigger også lige i manualen så :D
Avatar billede arne_v Ekspert
09. oktober 2003 - 10:43 #17
NOT IN tester om den ene værdi på venstre side ikke er blandt de nul til mange
værdier på højre side.
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