Jag har ett litet problem med en select-sats. Det finns säkert en enkel lösning, men jag kommer inte på den.
Jag har en order-tabell i en e-handelssajt. Varje rad i tabellen motsvarar en såld artikel och en ordrana hålls ihop av en kolumn som heter order_nr.
Det jag skulle kunna göra är att:
select distinct(order_nr) from order_tbl
men då får jag såklart bara ut order_nr-kolumnen. Jag vill såklart ha resten också. Blandar jag in ASP i det hela blir det lätt, men jag vill undvika det.
Just nu ser SQL-satsen ut så här:
select distinct(order_nr),* from order_tbl o
inner join kund_tbl k
on o.kund_id=k.kund_id
inner join artikel_tbl a
on o.artikel_id=a.artikel_id
where @strSearchType like @strSearchString;
där @strSearchType är ett kolumnnamn och @strSearchString överraskande nog är en söksträng. =)
select min(orderid),ordernr,kundid
from order_tbl o
inner join kund_tbl k
on o.kund_id=k.kund_id
inner join artikel_tbl a
on o.artikel_id=a.artikel_id
where @strSearchType like @strSearchString
group by ordernr,kundid
Nu får du lägsta orderid inom varje unik grupp av ordernr och kundid
------------------ essentitia preter non sans multiplicandum
Det funkar, fast mina tabeller är aningen större än så. Inte heller innehållet i mina joins kommer med om man gör så. Jag är så långt under ytan på denna att jag knappt vet vad jag ska fråga. ;)
Resultatet ska bli som det jag fick innan, fast med alla kolumner i databasen, det handlar om korg_datum,artikel_pris,artikel_wap_pris osv.
Det är en stored procedure i MS SQL 7. Den börjar med:
CREATE PROCEDURE [_sp_order_list_wildcard]
@strSearchString varchar(40),
@strSearchType varchar(20)
AS
select......
Jag plockar alltså in @-värdena när jag anropar proceduren. Det verkar funka bra.
@strSearchString har värdet av '%formularvarde%'
@strSearchType kan ha värdet kund_enamn, kund_fnamn osv beroende på ett val i en selectlista. Inga fnuttar kring värdet alltså. Det verkar funka bra. =)
Men jag tror jag har fått till det nu.
select min(order_id) as order_id,order_nr,kund_fnamn,kund_enamn,kund_postort osv osv
from order_tbl o
inner join kund_tbl k
on o.kund_id=k.kund_id
inner join artikel_tbl a
on o.artikel_id=a.artikel_id
where @strSearchType like @strSearchString
group by kund_postort,kund_enamn,kund_fnamn,order_nr
Du är inte dum du, det blir som du säger. Det funkade med de enstaka bokstäverna k,u,n,d,_,e,n,a,m,n. samt tomt fält. =) Hade hoppats att kunna mata in tabellnamnet så, men det gick alltså inte.
Det får jag fixa på något annat sätt.
Angående den andra satsen. Den ballar ur när jag lägger till korg_datum i select och group by, då plötsligt dyker vissa tre ordernummer upp två ggr. =)
Svårt för dig att kolla upp utan databasen kanske, men har du någon idé?
För att lösa problemet med sökningen kan du antingen göra så här
if @strSearchType = 'kund_enamn'
select min(orderid),ordernr,kundid
from order_tbl o
inner join kund_tbl k
on o.kund_id=k.kund_id
inner join artikel_tbl a
on o.artikel_id=a.artikel_id
where kund_enamn like @strSearchString
group by ordernr,kundid
if @strSearchType = 'kund_fnamn'
select min(orderid),ordernr,kundid
from order_tbl o
inner join kund_tbl k
on o.kund_id=k.kund_id
inner join artikel_tbl a
on o.artikel_id=a.artikel_id
where kund_fnamn like @strSearchString
group by ordernr,kundid
osv, den blir lite tråkig om man har många kolumner.
Annars kan man göra så här
CREATE PROCEDURE [_sp_order_list_wildcard]
@strSearchString varchar(40),
@strSearchType varchar(20)
AS
declare @sqlstr varchar(400)
select @sqlstr = 'select min(orderid),ordernr,kundid
from order_tbl o
inner join kund_tbl k
on o.kund_id=k.kund_id
inner join artikel_tbl a
on o.artikel_id=a.artikel_id
where ' + @strSearchType + ' like ' +
'''' + @strSearchString + '''' +
' group by ordernr,kundid'
exec (@sqlstr)
å andra sidan så blir det sämre prestanda då det måste kompileras varje gång.
Angående den andra satsen. Den ballar ur när jag lägger till korg_datum i select och group by, då plötsligt dyker vissa tre ordernummer upp två ggr. =)
Svårt för dig att kolla upp utan databasen kanske, men har du någon idé?
Nej, jag har ingen direkt ide.
Hur ser frågan ut nu?
red: Glömde tag
------------------ essentitia preter non sans multiplicandum
det var när jag la in "korg_datum" i frågan som det hände.
select min(order_id) as order_id,order_nr,korg_datum
from order_tbl o ....
Men jag kan klara mig utan det datumet. Jag tog din sql-procedur rakt av och den funkade perfekt. Hittade ingen (C) på den så jag använder den med lite modifikationer.
Tack för hjälpen! =)
142 ms totalt · 3 externa anrop · v20260731065814-full.b746b907