Gå til innhold

Problem med AND / OR


Gjest Slettet+6132

Anbefalte innlegg

Gjest Slettet+6132

Jeg har denne tabellen:

 

mysql> describe collections;

+-------+--------------------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+--------------------------+------+-----+---------+-------+

| id | int(4) unsigned zerofill | NO | PRI | | |

| owner | int(4) unsigned zerofill | NO | | | |

| title | varchar(255) | NO | | | |

+-------+--------------------------+------+-----+---------+-------+

3 rows in set (0.01 sec)

 

Inni denne tabellen har jeg:

 

mysql> select * from collections;

+------+-------+------------------+

| id | owner | title |

+------+-------+------------------+

| 9999 | 0000 | No collection |

| 0001 | 0001 | Agent Cody Banks |

| 0002 | 0001 | American Pie |

+------+-------+------------------+

3 rows in set (0.00 sec)

 

Så skal jeg hente ut data fra denne tabellen, owner 0000 er ikke en owner fordi collection 9999 skal kunne brukes av alle.

 

Meningen er at jeg skal hente ut tittel basert på id, men tittelen skal ikke kunne hentes ut hvis ikke owner er iden til personen (altså 0001 på meg) eller owner er 0000.

 

Jeg har prøvd følgende:

SELECT title FROM collections WHERE id = '0001' AND owner = '0001' OR '0000' LIMIT 1

 

Den fungerer helt til jeg skal hente ut den med id 9999, da får jeg bare "empty set". Hva gjør jeg galt?

 

EDIT: Hvis jeg putter på "owner =" før 0000 får jeg bare "No collection" uansett :no:

Endret av Slettet+6132
Lenke til kommentar
Videoannonse
Annonse
Den fungerer helt til jeg skal hente ut den med id 9999, da får jeg bare "empty set". Hva gjør jeg galt?

 

Titt på hva du har etter din siste OR. I dette tilfellet har du '0000' og dette blir sett på som et uttrykk og evalueres til false. Slik skal spørringen din se ut:

 

SELECT title FROM collections WHERE id = '9999' AND owner = '0001' OR owner = '0000' LIMIT 1

 

En vanlig feil å begå, tro du meg :!:

 

Werner

Lenke til kommentar

Nå har jeg ingen peiling på MySQL sin syntax, men ut fra hva jeg kan om MS SQL Server så kan jeg si følgende:

 

For det andre så er owner og id av type int, men du har pakket inn verdiene i enkelapostrof (') som angir at verdiene er av type varchar.

 

For det andre så er uttrykke owner='0000' or '0001' ikke det samme som at owner skal være '0000' eller '0001'. Det du har skrevet er at owner skal være OR produktet av '0000' og '0001'. Regner med at MySQL implisitt prøver å konvertere varchar til int når brukeren skriver slike feil, og da blir uttrykket slik: owner=0001 fordi 0000 OR 0001=1.

For å få det til å virke så må du skrive det slik: WHERE id = 1 AND (owner = 1 or owner=0). Alternativt så kan du også skrive slik: WHERE id=1 and owner in (0,1)

 

Ser at du har brukt verdien 9999 som en spesiell verdi. Håper du er klar over at maks verdien for unsigned int(4) ikke er 9999, men 4.228.250.625

 

EDIT: La til parenteser i WHERE id = 1 AND (owner = 1 or owner=0). Det er viktig å lære hvordan MySQL (og andre database for den saks skyld) behandler WHERE uttrykk med AND og OR.

Endret av kaffenils
Lenke til kommentar
(...)

5664204[/snapback]

 

Les hva jeg skrev etter "EDIT" i forrige innlegg, det fungerer ikke.

5664218[/snapback]

Les hva wernie skrev du han har rett:

 

... AND owner = '0001' OR '0000' LIMIT 1

 

Probolmet her er at OR '0000' tolkes som OR false.

 

Du har to muligheter som vil gi deg korrekt svar (gitt at jeg ikke dumper borti noe som MySQL ikke støtter):

 

... AND owner IN ['0000','0001']

 

og den enklere:

 

... AND (owner = '0001' OR 'owner = '0000')

 

Edit: Grunnen til at du bare fikk no collection uansett var rekkefølgen operatorer utføres i. De kan du like gjerne lære deg først som sist, og en av de viktigere reglene å få med seg der er at AND evalueres før OR.

Endret av roac
Lenke til kommentar
Gjest Slettet+6132
(...)

Ser at du har brukt verdien 9999 som en spesiell verdi. Håper du er klar over at maks verdien for unsigned int(4) ikke er 9999, men 4.228.250.625

(...)

5664358[/snapback]

Den maksimale verdien vil jo bli 9999, men den maksimale verdien for INT er tallet du oppga. Men takk for hjelpen, det virka :)

 

... AND (owner = '0001' OR owner = '0000')

Edit: Grunnen til at du bare fikk no collection uansett var rekkefølgen operatorer utføres i. De kan du like gjerne lære deg først som sist, og en av de viktigere reglene å få med seg der er at AND evalueres før OR.

5664393[/snapback]

 

Takk, dere har vært hjelpsomme begge to. Er ikke så vant til å bruke AND / OR i MySQL, er ikke så veldig ofte man har bruk for det :p

Lenke til kommentar
Gjest Slettet+6132
Takk, dere har vært hjelpsomme begge to. Er ikke så vant til å bruke AND / OR i MySQL, er ikke så veldig ofte man har bruk for det :p

5664460[/snapback]

Bare vent til du begynner å bruke SQL en del du, så vil du oppdage at du tar skremmende feil her. Det brukes hele tiden :)

5664488[/snapback]

 

Høhø, jeg bruker SQL ganske mye fra før. Hvis du sjekker ut nederste linken i signaturen min er det prosjektet jeg jobber på for tiden, er et par tusen linjer kode til nå ;)

 

Uansett, takk for hjelpen karer :p

Lenke til kommentar
Les hva jeg skrev etter "EDIT" i forrige innlegg, det fungerer ikke.

5664218[/snapback]

 

Jeg testa scenariet ditt i en MySQL-database, og fikk den raden jeg skulle ha ut, med den modifiserte setningen. Og som andre har påpekt i denne tråden, bør du kanskje heller bruke IN.

 

Werner

Lenke til kommentar
Gjest Slettet+6132
Les hva jeg skrev etter "EDIT" i forrige innlegg, det fungerer ikke.

5664218[/snapback]

 

Jeg testa scenariet ditt i en MySQL-database, og fikk den raden jeg skulle ha ut, med den modifiserte setningen. Og som andre har påpekt i denne tråden, bør du kanskje heller bruke IN.

 

Werner

5665415[/snapback]

 

Jupp :)

Lenke til kommentar
Høhø, jeg bruker SQL ganske mye fra før. Hvis du sjekker ut nederste linken i signaturen min er det prosjektet jeg jobber på for tiden, er et par tusen linjer kode til nå ;)

5665005[/snapback]

Når du ikke kjenner rekkefølgen til operatorer er du ikke erfaren i bruk av databaser, men for all del, alle må begynne et sted. SQL er et relativt omfattende tema, og etter hvert som man leker seg og jobber med det ser man etterhvert at SQL kan løse en rekke oppgaver ganske effektivt. Jeg bruker SQL både i jobb og leker meg hjemme, og i sistnevnte tilfelle skal jeg ha MSSQL til å løse SuDoku for meg. Jeg vet at Itzik Ben-Gan skrev en artikkel om temaet, den har jeg bevisst latt være å lese, da jeg bruker dette som en liten læring selv. Det er utrolig lærerikt for å se på hvordan man effektivt kan behandle sett med data :)

 

Jeg lurer forøvrig på når jeg skal begynne å lage et arkiv selv, jeg har begynt å systemere slikt flere ganger, men hver gang har det strandet siden det har lett for å bli alt for mye jobb, siden jeg vil ha det veldig fleksibelt.

Lenke til kommentar
Gjest Slettet+6132
(...)

5665813[/snapback]

 

Er sant det du sier, men når jeg bruker databaser i PHP-koder går det mest ut på å hente ut data, noen ganger med en WHERE noe = 'ettellerannet'. Har aldri vært borti så mye som at jeg måtte ha både AND og OR. Pleier også leke meg med å kode, enkelte ganger kan jeg starte et prosjekt av ren kjedsomhet og så viser det seg å være nyttig til slutt ;)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...