WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   SQL-problem (https://www.wn.se/forum/showthread.php?t=17047)

pellebannan 2006-10-22 16:53

Hej.

Jag använder följande sats:

SELECT * FROM medlemmar WHERE TRIM = 'Ja' AND RAS1 = 'DS' OR RAS2 = 'DS' OR RAS3 = 'DS' ORDER BY 'POSTADRESS'

I tabellen finns även ett fält som heter "MEDLEMTILL" som är i "DATE"-format. Där finns det datum där medlemmsskapet upphör. Hur skriver jag i satsen ovan för att INTE välja dom medlemmar där medlemmsskapet har upphört.

/peter

elofsson 2006-10-22 17:01

MEDLEMTILL < NOW()

eg0master 2006-10-23 08:13

Snarare MEDLEMTILL > NOW() för att välja bara de medlemmar där medlemskapet inte upphört.

zoran 2006-10-23 08:16

Citat:

Originally posted by pellebannan@Oct 22 2006, 16:53
Hej.

Jag använder följande sats:

SELECT * FROM medlemmar WHERE TRIM = 'Ja' AND RAS1 = 'DS' OR RAS2 = 'DS' OR RAS3 = 'DS' ORDER BY 'POSTADRESS'

I tabellen finns även ett fält som heter "MEDLEMTILL" som är i "DATE"-format. Där finns det datum där medlemmsskapet upphör. Hur skriver jag i satsen ovan för att INTE välja dom medlemmar där medlemmsskapet har upphört.

/peter

Får jag bara anmärka på "TRIM='Ja'". Jag antar att alternativet är "TRIM='Nej'", dvs du försöker lagra boolean. För boolean lämpar sig tinyint(1) bättre än (var)char .

Nu kanske du har också "Kanske" som ett val, men jag har iallafall sagt vad jag tänkte :).

jon 2006-10-23 08:16

Du bör nog även ha några paranteser...
SELECT * FROM medlemmar WHERE TRIM = 'Ja' AND (RAS1 = 'DS' OR RAS2 = 'DS' OR RAS3 = 'DS') ORDER BY 'POSTADRESS'

Jake.Nu 2006-10-23 14:20

Citat:

Ursprungligen postat av zoran
Citat:

Ursprungligen postat av pellebannan
Hej.

Jag använder följande sats:

SELECT * FROM medlemmar WHERE TRIM = 'Ja' AND RAS1 = 'DS' OR RAS2 = 'DS' OR RAS3 = 'DS' ORDER BY 'POSTADRESS'

I tabellen finns även ett fält som heter "MEDLEMTILL" som är i "DATE"-format. Där finns det datum där medlemmsskapet upphör. Hur skriver jag i satsen ovan för att INTE välja dom medlemmar där medlemmsskapet har upphört.

/peter

Får jag bara anmärka på "TRIM='Ja'". Jag antar att alternativet är "TRIM='Nej'", dvs du försöker lagra boolean. För boolean lämpar sig tinyint(1) bättre än (var)char .

Nu kanske du har också "Kanske" som ett val, men jag har iallafall sagt vad jag tänkte :).

Skall man optimera som mest så kan du skapa en CHAR(0) NULL.
Är den NULL så är det falskt och är den tom (inte NULL då) så är det sant.

Tar bara upp en bit istället för dina oändligt stora åtta bit ;)

martine 2006-10-23 15:32

Pedagogiskt är väl snarare ENUM('ja','nej','kanske') även om det tar hela tar sina åtta bit... Att använda VARCHAR är ju genomkasst men jag misstänker att CHAR(0) blir lite opraktiskt om man inte måste optimera ändlöst... ENUM är ju också praktiskt genom att man kan ställa querien på samma sätt som om det vore en textsträng utan att ändra något. Dessutom vet jag inte hur många gånger jag har trott att ja/nej räcker bara för att senare vara tvungen att ändra till 'kanske','vet ej','snart','ibland'... Där är ENUM oslagbart. Och den lilla tyngden som 8 bitar utgör är knappast ett problem.

Edit: ENUM() och SET() är verkligen underskattade har jag en känsla av. När man går tillbaks till en tabell med CHAR(0) efter ett halvår (eller får en tabell som någon annan skapat) så är risken stor att man inte fattar ett jota av hur man tänkt. Roligt som kuriosa dock...

pellebannan 2006-10-23 15:56

Det är löst! :D
Så här blev det:
SELECT * FROM medlemmar WHERE TRIM = 'Ja' AND (RAS1 = 'DS' OR RAS2 = 'DS' OR RAS3 = 'DS') AND MEDLEMTILL > NOW() ORDER BY 'POSTADRESS'

/peter

martine 2006-10-23 16:12

Liten kommentar till den egentliga frågan:
Citat:

Originally posted by pellebannan@Oct 23 2006, 15:56
Hur skriver jag i satsen ovan för att INTE välja dom medlemmar där medlemmsskapet har upphört.
Om du inte har satt något datum på dem som fortfarande är medlemmer så är det NULL om du har DEFAULT NULL så kan du också använda … WHERE medlemtill IS NULL (eftersom de ännu inte har något slutdatum). Borde i alla fall vara lite snabbare.

Jake.Nu 2006-10-23 19:19

Citat:

Originally posted by martine@Oct 23 2006, 15:32
Pedagogiskt är väl snarare ENUM('ja','nej','kanske') även om det tar hela tar sina åtta bit... Att använda VARCHAR är ju genomkasst men jag misstänker att CHAR(0) blir lite opraktiskt om man inte måste optimera ändlöst... ENUM är ju också praktiskt genom att man kan ställa querien på samma sätt som om det vore en textsträng utan att ändra något. Dessutom vet jag inte hur många gånger jag har trott att ja/nej räcker bara för att senare vara tvungen att ändra till 'kanske','vet ej','snart','ibland'... Där är ENUM oslagbart. Och den lilla tyngden som 8 bitar utgör är knappast ett problem.

Edit: ENUM() och SET() är verkligen underskattade har jag en känsla av. När man går tillbaks till en tabell med CHAR(0) efter ett halvår (eller får en tabell som någon annan skapat) så är risken stor att man inte fattar ett jota av hur man tänkt. Roligt som kuriosa dock...

Ja visst är det kuriosa och jag måste ju erkänna att jag aldrig använder CHAR(0) NULL och knappast skulle komma på tanken heller :).
SET och ENUM är dom två jag använder mest.
Handlar det t.ex. om att en eller flera värden kan vara valda så är det ju SET som uteslutande gäller, annars för ja/nej är det ENUM eller TINYINT. Jag arbetar hellre med INT(i alla sina storlekar) än CHAR ('value') eftersom min erfarenhet är att numeriska värden alltid går snabbare att jobba med gentemot databasen.


Alla tider är GMT +2. Klockan är nu 04:25.

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