WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   MySQL lyder inte mig! (https://www.wn.se/forum/showthread.php?t=26756)

KarlRoos 2008-01-30 20:10

MySQL lyder inte mig :huh:

Detta är min query:
Kod:

SELECT *
FROM trainingbook_entries
WHERE user = '533915543'
OR user = '544576097'
OR user = '573490598'
OR user = '620155054'
OR user = '671980664'
OR user = '709760429'
OR user = '740625439'
OR user = '777390801'
OR user = '779794282'
OR user = '781018407'
AND date = '2008-01-30'
ORDER BY id DESC
LIMIT 0 , 30

Resultatet blir detta:
http://karlroos.se/skit/mysql.png

Som ni ser så har ingen av fälten "date" värdet 2008-01-30 ! <_<
Finns det något jag kan göra?

Tack på förhand!

grazzy 2008-01-30 20:25

Till att börja med borde du använda WHERE user IN(värde, värde, värde) istället för OR-frågan. Felet beror på att AND binder hårdare än OR. I det här fallet blir din fråga de första valen ELLER user = '781018407' AND date = '2008-01-30'. DU måste alltså lägga en parantes kring alla OR-grejerna.

Sedan känns det inte så smidigt att lagra ett heltal som en sträng heller...

WizKid 2008-01-30 20:25

Använda parentes.

Eller skriva den som
Kod:

SELECT *
FROM trainingbook_entries
WHERE user IN('533915543', '544576097', ...) AND date = '2008-01-30'
ORDER BY id DESC
LIMIT 0 , 30


KarlRoos 2008-01-30 20:43

Okej! :)
Tack så mycket, funkar utmärkt!

Magnus_A 2008-01-30 21:13

När du villkorar ett värde som du vet är ett tal så ska du ta bort fnuttarna. Annars måste mysql slösa kraft på att göra om talet till en sträng innan jämförelsen.
...where user=123456 ska det vara och inte ...where user='123456'

martine 2008-01-31 13:43

Citat:

Originally posted by Magnus_A@Jan 30 2008, 22:13
När du villkorar ett värde som du vet är ett tal så ska du ta bort fnuttarna. Annars måste mysql slösa kraft på att göra om talet till en sträng innan jämförelsen.
...where user=123456 ska det vara och inte ...where user='123456'

Förutsatt att column-typen är heltal, om det är en sträng så bör den hämtas som en sträng.

Magnus_A 2008-01-31 14:24

Citat:

Originally posted by martine@Jan 31 2008, 14:43

Förutsatt att column-typen är heltal, om det är en sträng så bör den hämtas som en sträng.

Precis, annars slösas kraften på att försöka göra om strängen till ett tal!

KarlRoos 2008-01-31 21:55

Citat:

Originally posted by martine@Jan 31 2008, 14:43

Förutsatt att column-typen är heltal, om det är en sträng så bör den hämtas som en sträng.

Alla värderna som kommer att hämtas är nummer.
Tabellen är BigINT, är det smartare med user=123456 då?

martine 2008-01-31 22:14

Citat:

Originally posted by KarlRoos@Jan 31 2008, 22:55
Alla värderna som kommer att hämtas är nummer.
Tabellen är BigINT, är det smartare med user=123456 då?

Tabellen är inte BIGINT (tabellen har stängar, datum och nummer som datatyper såvitt jag kan se), möjligtvis är columnen "user" en BIGINT och i så fall är det bättre att använda talet 123456 och inte strängen '123456'. Stängar anges med tecknet ' i SQL, tal som 5 eller 6.7 anges utan '

Det finns vissa skillnader mellan att använda strängar och tal inte bara i effektivitet och platsnyttjande. Vid strängar är exempelvis stängarna '001234', '01234' och '1234' helt skilda "värden". Om det hande om tal så är det ingen skillnad mellan 001234 och 1234. Samma sak gäller om du anger bråktal med eller utan '
Talet 234.3 är samma tal som 234.300 men strängen '234.3' är inte detsamma som '234.300'. Det kan förutom resursslöseri alltså även innebära svårupptäckta buggar.

KarlRoos 2008-02-01 17:04

Citat:

Originally posted by martine@Jan 31 2008, 23:14
Det finns vissa skillnader mellan att använda strängar och tal inte bara i effektivitet och platsnyttjande. Vid strängar är exempelvis stängarna 001234, 01234 och 1234 helt skilda värden. Om det hande om tal så är det ingen skillnad mellan 001234 och 1234. Samma sak gäller om du anger bråktal med eller utan
Talet 234.3 är samma tal som 234.300 men strängen 234.3 är inte detsamma som 234.300. Det kan förutom resursslöseri alltså även innebära svårupptäckta buggar.

Så om talen inte kommer att börja med nollor och inte ha några decimaler så är det bättre för effektiviteten?

martine 2008-02-02 13:16

Nej. Det har inget med effiktiviteten att göra. Jag försökte bara tydliggöra att om man är slarvig på att hålla reda på vilken datatyp man använder så kan problem uppstå. (Även om det kan påpekas att heltal är effekivare att lagra och bearbeta än tal med decimaler.)

Nummer sparas effektivast som heltal dvs. INT i olika storlekar. Att spara nummer som strängar tar onödig plats och är också mindre effektivt prestandamässigt.

Vad du bör tänka på är framförallt att vara konsekvent. Om du lagrar data så hämta den som en sträng (med ''), om det är ett siffra lagrad som ett heltal så hämta som ett heltal (utan '') precis som Magnus_A påpekat i sitt inlägg om de så kallande "fnuttarna".

KarlRoos 2008-02-02 18:34

Okej, då förstår jag!
Tack så mycket :)


Alla tider är GMT +2. Klockan är nu 19:47.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson