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'))
13 svar · 629 visningar · startad av tlee
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
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'))
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?
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?
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.. ? :)
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?
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?
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
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
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..
Du skola använda parenteser på rätt sätt:
AND (p.fldArticleName LIKE '%hg%'
OR p.fldArticleNr LIKE '%hg%')
emission och @nders .. stort tack, det smider fint här nu!!
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 ;) )