Panelen



Forumnavigering
Senast inloggade
RSS
Sponsorer

Forum > Webbutveckling relaterat > Databaser och SQL

hjärnsläpp i SQL-query

nabbiii
nabbiii

Gradering

#19001

Hejsan...
tror jag är rätt trött nu... men får inte en simple grej att funka... :S

om jag har en tabell som ser ut på detta vis;

--user--

namn    intressen    år
Jakob    1539            1984
Jonas    1599            1984
Sara      59               1984
Emma    624             1984

nu vill via ett forumär kunna bocka för alla som har "intresse" [X] 1 och [X] 5 och sedan är det bara dem som ska visas... hur gör jag detta... jag försökte lösa det genom:

mSQL = "SELECT COUNT(*) as CountUser FROM user WHERE year(birth) >= 1984"
       
        If Request.Form("y1") <> "" Then
            mSQL = mSQL + " AND intressen LIKE '1'"
        End If
        If Request.Form("y2") <>
"" Then
            mSQL = mSQL + " AND intressen LIKE '2'"
        End If
        If Request.Form("y3") <> "" Then
            mSQL = mSQL + " AND intressen LIKE '5'"
        End If

 

på detta vis får jag endast ut jakob och jonas (vilket är förstårligt, eftersom det är bara dem som har 1 & 5), men jag skulle även vilja få fram sara som har "5", jag kan häller inte skriva på detta vis:

mSQL = "SELECT COUNT(*) as CountUser FROM user WHERE year(birth) >= 1984"
       
        If Request.Form("y1") <> "" Then
            mSQL = mSQL + " OR intressen LIKE '1'"
        End If
        If Request.Form("y2") <>
"" Then
            mSQL = mSQL + " OR intressen LIKE '2'"
        End If
        If Request.Form("y3") <> "" Then
            mSQL = mSQL + " OR intressen LIKE '5'"
        End If

så får jag fram alla.. (vilket oxå är förstårligt) :S

så till min fråga... hur får jag fram, jabok, jonas och sara

Redigerades av nabbiii den 2 januari 2010. Läs tidigare inlägg.
Redigerades av nabbiii den 2 januari 2010. Läs tidigare inlägg.
ID: #19001 | Skapades: 2010-01-02 02:54:32 | Tråden har 8 svar och har lästs 298 gånger.

voigtan
voigtan

Gradering

#19002

        If Request.Form("y1") <> "" Then
            mSQL = mSQL + " OR work LIKE '"1"'"
        End If
        If Request.Form("y2") <>
"" Then
            mSQL = mSQL + " OR work LIKE '"2"'"
        End If
        If Request.Form("y3") <> "" Then
            mSQL = mSQL + " OR work LIKE '"5"'"
        End If
är ju fortfarande en felaktigt sträng uppbyggnad.

Och även:

mSQL = "SELECT COUNT(*) as CountUser FROM user WHERE year(birth) >= 1984
Så avslutar du inte din sträng.

Skaffa ett program/editor som färgar kod, för det verka som du har svårigheter när det gäller sträng uppbyggnader:

mSQL = "SELECT COUNT(*) as CountUser FROM user WHERE year(birth) >= 1984"
If Request.Form("y1") <> "" Then
    mSQL = mSQL + " AND work LIKE '1'"
End If
If Request.Form("y2") <>
"" Then
    mSQL = mSQL + " AND work LIKE '2'"
End If
If Request.Form("y3") <> "" Then
    mSQL = mSQL + " AND work LIKE '5'"
End If
Är "work" av fälttypen varchar? Ser ju ut mer att det skulle passa bättre med en tal än en tecken. Sen skall det inte vara AND för då måste work vara 1 och 2 och 5 om vi väljer alla kryssrutor, vilket inte stämmer för det resultat du vill ha.

Citat:
om jag har en tabell som ser ut på detta vis
Det kan ju inte vara hela din tabell, eftersom din fråga innehåller en "work" också, vilket du inte ha definierat i ditt inlägg.

Upptäcker också att du kör med "+" för att bygga ihop strängar, vilket inte stämmer i Klassisk ASP eller i VB.NET

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
Redigerades av voigtan den 2 januari 2010. Läs tidigare inlägg.
Redigerades av voigtan den 2 januari 2010. Läs tidigare inlägg.
Redigerades av voigtan den 2 januari 2010. Läs tidigare inlägg.
Redigerades av voigtan den 2 januari 2010. Läs tidigare inlägg.
ID: #19002 | Skapades: 2010-01-02 10:01:50

nabbiii
nabbiii

Gradering

#19004

ok, kolla nu på inlägget ovan, har ändrat koden så den passar in... work var en 4:e column som inte skulle hamna med...
men det kan ju inte heller vara OR, eftersom då visar den ALLA :(

mSQL = "SELECT COUNT(*) as CountUser FROM user WHERE year(birth) >= 1984"
If Request.Form("y1") <> "" Then
    mSQL = mSQL + " OR work LIKE '1'"
End If
If Request.Form("y2") <>
"" Then
    mSQL = mSQL + " OR work LIKE '2'"
End If
If Request.Form("y3") <> "" Then
    mSQL = mSQL + " OR work LIKE '5'"
End If

Redigerades av nabbiii den 2 januari 2010. Läs tidigare inlägg.
Redigerades av nabbiii den 2 januari 2010. Läs tidigare inlägg.
ID: #19004 | Skapades: 2010-01-02 14:33:09

voigtan
voigtan

Gradering

#19005

Du kan ju inte köra OR på det sättet, då är det där födelsedagen är 1984 ELLER Work =1 ELLER work är 2 eller 3. Du måste läsa din SQL fråga om vad den gör om det inträffar något. Så din kod gör rätt, men inte det du är ute efter, du få ha en flagga som se om y1, y2 eller y3 har kört minst en gång för du vill ha att frågan skall se ut något i stil med:

SELECT COUNT(*) as CountUser FROM user WHERE year(birth) >= 1984 and work ='1' or work='2'
Varför kör du en like på work? Vad innehåller work?

Function iif(statement, trueMethod, falseMethod)
    If statement Then
        iif = trueMethod
    Else
        iif = falseMetod
    End If
End Function

dim bExtraQuery
mSQL = "SELECT COUNT(*) as CountUser FROM user WHERE year(birth) >= 1984"
If Request.Form("y1") <> "" Then
    mSQL = mSQL & "AND work LIKE '1'"
    bExtraQuery = True
End If
If Request.Form("y2") <>
"" Then
    mSQL = mSQL & iif(bExtraQuery," OR", " AND") & " work LIKE '2'"
    bExtraQuery = True
End If
If Request.Form("y3") <> "" Then
    mSQL = mSQL & iif(bExtraQuery," OR", " AND") & " work LIKE '5'"
    bExtraQuery = True
End If
Liknande funktioner och emtoder kan fungera.

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
Redigerades av voigtan den 2 januari 2010. Läs tidigare inlägg.
ID: #19005 | Skapades: 2010-01-02 16:37:30

nabbiii
nabbiii

Gradering

#19006

nej jag tog ju bort work från första inlägget, det är den som är korrekt.. det ska vara "intressen" där och inte "work"

ID: #19006 | Skapades: 2010-01-02 18:30:02

voigtan
voigtan

Gradering

#19007

Ok, fortfarande min kod borde stämma med det du är ute efter, nu skall jag ge dig ett tips till framtiden, blanda ALDRIG språk när du utvecklar

Svenska och engelska i dina tabeller (referera till ditt andra inlägg du skrev ungefär samtidigt), du gör dig själv en jätte tjänst att köra ett språk som är globalt, svenskar i utveckling passar verkligen inte in, är fruktansvärt fult att köra blandningar i tabellstrukturer, känns jätte oseriöst och inte genomtänkt databas design.

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
ID: #19007 | Skapades: 2010-01-02 18:36:15

nabbiii
nabbiii

Gradering

#19008

Citerar voigtan:

Ok, fortfarande min kod borde stämma med det du är ute efter, nu skall jag ge dig ett tips till framtiden, blanda ALDRIG språk när du utvecklar

Svenska och engelska i dina tabeller (referera till ditt andra inlägg du skrev ungefär samtidigt), du gör dig själv en jätte tjänst att köra ett språk som är globalt, svenskar i utveckling passar verkligen inte in, är fruktansvärt fult att köra blandningar i tabellstrukturer, känns jätte oseriöst och inte genomtänkt databas design.

 

 

ok nu körde jag koden som du sa, men får fortfarande fel :S
det funka bra sålänge 1:a bocken är bockad... dvs bockar jag 1:an och 3:an funkar det bra.. ;) men bockar jag tex 2:an och 3:an funkar det inte heller inte om jag bockar endast 2:an...

bockar jag tex bara in 2:an får jag en SQL query som ser ut på detta viset (den saknar 'AND')

SELECT COUNT(*) as CountUser FROM user WHERE year(birth) >= 1984 intressen LIKE '2'

hmm det verkar som om den retunerar "" vid bExtraQuery = false :S

ahaa.. ser nu att du hade råkat stava fel på method ;)

Redigerades av nabbiii den 2 januari 2010. Läs tidigare inlägg.
Redigerades av nabbiii den 2 januari 2010. Läs tidigare inlägg.
ID: #19008 | Skapades: 2010-01-02 19:06:02

voigtan
voigtan

Gradering

#19009

Jag har ingen metod, jag har en funktion, vilket du har rätt:

Function iif(statement, trueMethod, falseMethod)
    If statement Then
        iif = trueMethod
    Else
        iif = falseMethod
    End If
End Function
med ett h på falseMethod.

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
ID: #19009 | Skapades: 2010-01-02 19:30:39

voigtan
voigtan

Gradering

#19022

Du skall nog köra med "%" i dina like frågor med.

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
ID: #19022 | Skapades: 2010-01-03 17:41:33
© Copyright 2007-2009 Shadi Domat | Version 3.0 | Sidkarta | Policy