webForumDet fria alternativet

subquery problem..

13 svar · 629 visningar · startad av tlee

tleeMedlem sedan mars 2001290 inlägg
#1

Hej,

Jag har två tabeller.

tblProductArticles: Artikelregister
fldArticleNr
fldArticleName
fldArticleDesc
fldArticlePosition
fldArticlePrice1
fldArticlePrice2
fldArticlePrice3
fldArticlePrice4
fldArticlePrice5
fldArticleGroup = varugruppsid (samma som tbl_tobias.fldId)
fldArticleActive

tbl_tobias:
fldIncrease
fldActive
fldId = varugruppsid (samma som tblProductArticls.fldArticleGroup)

Nedan SQL resulterar alla artiklar som ligger i varugruppen(HD)

SELECT p.fldArticlePosition, p.fldArticleDesc, p.fldArticleNr, p.fldArticleName, p.fldArticlePrice1, p.fldArticlePrice2,
       p.fldArticlePrice3, p.fldArticlePrice4, p.fldArticlePrice5, p.fldArticleGroup, p.fldArticleActive,
       t.fldIncrease, t.fldActive, t.fldId
       FROM tbl_tobias t, tblProductArticles p 
       WHERE (p.fldArticleGroup = t.fldId) AND (t.fldId='HD') AND (t.fldActive='yes')
       ORDER BY p.fldArticlePosition;

Vad jag håller på med nu är en sökfunktion som skall söka igenom alla produkter i de varugrupper som kunden markerad som aktiva (tbl_tobias.fldActive=yes).
Problemet är att jag inte kan söka rätt ifrån artikelregistret utan bara söka bland de artiklar som finns i de varugrupper som kunden har markerat som aktiva.

frågan är då hur en sql skulle se ut för det, jag har funderat på något sånt här men får det inte att fungera.

SELECT p.fldArticlePosition, p.fldArticleDesc, p.fldArticleNr, p.fldArticleName, p.fldArticlePrice1, p.fldArticlePrice2,
       p.fldArticlePrice3, p.fldArticlePrice4, p.fldArticlePrice5, p.fldArticleGroup, p.fldArticleActive,
       t.fldIncrease, t.fldActive, t.fldId
       FROM tbl_tobias t, tblProductArticles p 
       WHERE (p.fldArticleGroup = (select t.fldId from t where t.fldActive='yes'))
       ORDER BY p.fldArticlePosition;

Nån som har lite förslag?

/t

@ndersMedlem sedan juni 200032 969 inlägg
#2

Eftersom du inte skriver vad du använder för dbms eller vad du får för felmeddelande kan jag bara gissa.

       WHERE (p.fldArticleGroup IN (select fldId from tbl_tobias where fldActive='yes'))
tleeMedlem sedan mars 2001290 inlägg
#3

ms sql är det.

SELECT p.fldArticlePosition, p.fldArticleDesc, p.fldArticleNr, p.fldArticleName, p.fldArticlePrice1, p.fldArticlePrice2,
       p.fldArticlePrice3, p.fldArticlePrice4, p.fldArticlePrice5, p.fldArticleGroup, p.fldArticleActive,  t.fldIncrease, t.fldActive, t.fldId
       FROM tbl_tobias t, tblProductArticles p 
       WHERE (p.fldArticleGroup IN (select fldId from tbl_tobias where fldActive='yes'))
       ORDER BY p.fldArticlePosition;

fungerar men den returnerar lite tokigt..

rec("fldId") = "cd"
rec("fldArticleGroup") = "conf1"
rec("fldId") = "dvd"
rec("fldArticleGroup") = "conf1"
rec("fldId") = "hd"
rec("fldArticleGroup") = "conf1"
rec("fldId") = "cpu2"
rec("fldArticleGroup") = "conf1"

varje artikelrad listats lika många gånger som den träffar i WHERE satsen.. så den listar varje artikel typ 25 ggr (antalet rader i tbl_tobias tabellen)
jag försöker lägga till flera villkor och då får jag följande felmeddelande.

Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

SELECT p.fldArticlePosition, p.fldArticleDesc, p.fldArticleNr, p.fldArticleName, p.fldArticlePrice1, p.fldArticlePrice2,
       p.fldArticlePrice3, p.fldArticlePrice4, p.fldArticlePrice5, p.fldArticleGroup, p.fldArticleActive,  t.fldIncrease, t.fldActive, t.fldId
       FROM tbl_tobias t, tblProductArticles p 
       WHERE (p.fldArticleGroup IN (select fldId, fldType  from tbl_tobias where fldActive='yes' and fldType='group'))
       ORDER BY p.fldArticlePosition;

vad tror ni?

@ndersMedlem sedan juni 200032 969 inlägg
#4

Jag är inte helt säker på vad du menar, men du kan ju prova att ta bort fldactive ur select:en i din subquery. Varför har du lagt den där?

tleeMedlem sedan mars 2001290 inlägg
#5
SELECT p.fldArticlePosition, p.fldArticleDesc, p.fldArticleNr, p.fldArticleName, p.fldArticlePrice1, p.fldArticlePrice2,
       p.fldArticlePrice3, p.fldArticlePrice4, p.fldArticlePrice5, p.fldArticleGroup, p.fldArticleActive,  t.fldIncrease, t.fldActive, t.fldId,
       g.fldGroupId, g.fldGroupParent, g.fldGroupType
       FROM tbl_tobias t, tblProductArticles p, tblProductGroups g 
       WHERE (p.fldArticleGroup IN (select fldId from tbl_tobias where fldActive='yes'))
       ORDER BY p.fldArticlePosition;

tog bort den och då listar den massa poster som inte skall listas, jag behöver lägga
till lite villkor från en tabell till. se nedan..

tblProductGroups: Varugruppsregister
fldGroupId = varugruppsid (samma värde som de andra tabellerna)
fldGroupParent = 'yes'
fldGroupType = 'group'

Vad jag vill ha ut från dessa tabeller är alla data ur tblProductArticles
som matchar nedan kriterier.

p.fldArticleGroup = t.fldId and p.fldArticleGroup = g.fldGroupId
t.fldActive='yes'
g.fldGroupParent = 'yes'
g.fldGroupType = 'group'

vad tror vi om det.. ? :)

emissionMedlem sedan dec. 19996 721 inlägg
#6

OK, ett par frågor:

Varför finns det flera rader i tbl_tobias? (Du nämner 25)
Finns det bara en kund, eller var är kund-id:t?

tleeMedlem sedan mars 2001290 inlägg
#7

Det finns flera rader eftersom den innehåller "varugrupper" och "datorkonfiguratorer"
Sen är en del grupper huvudgrupper som bara innehåller undergrupper och inga artiklar.
Bara undergrupperna som innehåller artiklar skall visas.

varugrupper = (fldType='group')
konfiguratorer = (fldType='config')

glömde det fältet i min tabellspec.

tbl_tobias ser ut såhär:
fldIncrease
fldActive
fldType
fldId = varugruppsid (samma som tblProductArticls.fldArticleGroup)

Det är bara varugrupperna som är intressanta i detta fallet då jag försöker
lista alla produkter som han har i sin butik (de som ligger i de aktiva varugrupperna som han har markerat som aktiva)

tbl_tobias <-- det är "tobias" som är kundid (tbl_" & strUserName)

tblProductGroups är huvudvarugruppsregistret och tbl_tobias är kundens
varugruppsregister som han användare i sin egna butik där han väljer
vilka varugrupper han vill inkludera/aktivera ifrån huvudregistret typ..

hmm.. fan va rörigt allt blev.. hänger ni med på vad jag menar?

emissionMedlem sedan dec. 19996 721 inlägg
#8

Men finns samma gruppid (fldId) flera gånger i tbl_tobias

Dessutom gillar jag inte att du låter strukturen vara en del av datan, dvs. att du har en specifik tabell för varje kund.

1. Databasanvändaren som körs från webben bör inte ha rätt att skapa och droppa tabeller
2. Det blir i princip omöjligt att göra stored procedures, den dag du känner att du vill/kan det
3. Det är skitjobbigt att göra generella uppdateringar av data och/eller strukturer

tleeMedlem sedan mars 2001290 inlägg
#9

okej..

nej, fldId finns bara en gång var i tbl_tobias

emissionMedlem sedan dec. 19996 721 inlägg
#10

tlee skrev:

okej..

Det var inte meningen att klanka ner på din lösning, utan jag ville bara tipsa om det, eftersom jag tror att du riskerar att skjuta dig i foten om du inte strukturerar om lite.

tlee skrev:

nej, fldId finns bara en gång var i tbl_tobias

I så fall borde första SQL-frågan du skrev fungera bra. Vi kan dock lägga till tblProductGroups-kopplingen

 
[COLOR=Red]SELECT [/COLOR]
    p.fldArticlePosition, 
    p.fldArticleDesc, 
    p.fldArticleNr, 
    p.fldArticleName, 
    p.fldArticlePrice1, 
    p.fldArticlePrice2, 
    p.fldArticlePrice3, 
    p.fldArticlePrice4, 
    p.fldArticlePrice5, 
    p.fldArticleGroup, 
    p.fldArticleActive, 
    t.fldIncrease, 
    t.fldActive, 
    t.fldId 
[COLOR=Blue]FROM[/COLOR] 
    tbl_tobias t, 
    tblProductArticles p, 
    tblProductGroups g 
[COLOR=Blue]WHERE [/COLOR]
    p.fldArticleGroup     = t.fldId 
    [B]AND [/B]p.fldArticleGroup = g.fldGroupId 
    [B]AND [/B]t.fldActive       = 'yes' 
    [B]AND [/B]g.fldGroupParent  = 'yes' 
    [B]AND [/B]t.fldType         = 'group' 
    [B]AND [/B]g.fldGroupType    = 'group' 
[COLOR=Blue]ORDER BY [/COLOR]
    p.fldArticlePosition
tleeMedlem sedan mars 2001290 inlägg
#11

grymt.. funkar klockrent... en liten grej till bara.. jag skulle vilja lägga till en LIKE också..

SELECT 
    p.fldArticlePosition, 
    p.fldArticleDesc, 
    p.fldArticleNr, 
    p.fldArticleName, 
    p.fldArticlePrice1, 
    p.fldArticlePrice2, 
    p.fldArticlePrice3, 
    p.fldArticlePrice4, 
    p.fldArticlePrice5, 
    p.fldArticleGroup, 
    p.fldArticleActive, 
    t.fldIncrease, 
    t.fldActive, 
    t.fldId 
FROM 
    tbl_tobias t, 
    tblProductArticles p, 
    tblProductGroups g 
WHERE 
    p.fldArticleGroup     = t.fldId 
    AND p.fldArticleGroup = g.fldGroupId 
    AND t.fldActive       = 'yes' 
    AND g.fldGroupParent  = 'no' 
    AND t.fldType         = 'group' 
    AND g.fldGroupType    = 'group' 
    AND p.fldArticleName LIKE '%hg%' 
    [b]OR p.fldArticleNr LIKE '%hg%'[/b]
ORDER BY 
    p.fldArticlePosition

Sökningen skall träffa på antingen artikelnr eller artikelnamn.. lägger jag till OR satsen där så söker han igen hela artikelregistret och hittar artiklar som inte ligger i de markerade varugrupperna..

@ndersMedlem sedan juni 200032 969 inlägg
#12

Du skola använda parenteser på rätt sätt:

AND (p.fldArticleName LIKE '%hg%' 
    OR p.fldArticleNr LIKE '%hg%')
tleeMedlem sedan mars 2001290 inlägg
#13

emission och @nders .. stort tack, det smider fint här nu!!

@ndersMedlem sedan juni 200032 969 inlägg
#14

Acceptera gärna emissions svar som slutgiltigt istället, då det är huvudsakligen där lösningen finns. :)

(om inte du gör det själv så tänker jag göra våld och fixa det själv ;) )

137 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)