29. august 2006 - 15:40Der er
28 kommentarer og 1 løsning
3 queries - hver med output der afhænger af hinanden
Jeg har en tabel med bannere i. Jeg skal på min side altid vise 8 bannere. De er opdelt i placeringer på følgende måde: 2 stks. top-placering 2 stks. midtplacering 4 stks. bundplacering.
Hver placering skal vise et tilfældigt banner og det samme banner må ikke vises flere gange på samme side.
Jeg har forsøgt med følgende: SELECT AdvID, advname, advimage, placering FROM (SELECT TOP 2 AdvID, AdvImage, AdvName, "1" as Placering FROM Cust_TradeFairAdvertisements WHERE Cust_TradeFairAdvertisements.CategoryID In (8,10,11,9) AND MaxTop > UsedTop ORDER BY RND(AdvID)
union select * from (SELECT TOP 2 AdvID, AdvImage, AdvName, "2" as Placering FROM Cust_TradeFairAdvertisements WHERE Cust_TradeFairAdvertisements.CategoryID In (8,10,11,9) AND MaxMiddle > UsedMiddle ORDER BY RND(AdvID))
union select * from (SELECT TOP 4 AdvID, AdvImage, AdvName, "3" as Placering FROM Cust_TradeFairAdvertisements WHERE Cust_TradeFairAdvertisements.CategoryID In (8,10,11,9) AND MaxBottom > UsedBottom ORDER BY RND(AdvID)) ) ORDER BY placering;
- men på denne måde risikerer jeg at få vist samme banner flere gange. Nogle forslag?
Jeg tror desværre ikke at du kan gøre det i rent SQL, og i én SQL-sætning. Der skal også noget programmering til, og så skal den deles op i 3 separate SQL-kald.
Well the top 2 and the bottom 4 should be no problem, th eproblem is finding the middle 2. This would require finding how many records are in the table and then selecting the top 2 which lie under the (top half - 1).
It could maybe be done in one SQL but it would take a bit of playing about I think.
skovtrold, jeg er enig med de andre i, at det vist ikke kan gøres i ren Access-SQL, men kan du ikke bare selektere 8 tilfældige rækker og så under indlæsningen til en array påføre hvilket område rækken skal tilhøre. Det skulle være let nok... - siger jeg der ikke arbejder i .NET *G*
Vi snakker VB.NET Jeg vil helst undgå for mange connections til databasen. Problemet er, at jeg indenfor hver visning (top, midt og bund) skal finde tilfældige ID'er, og disse ID'er må kun vises een gang på siden - dvs. kun een gang indenfor de 8 udvalgte. Samtidig skal mit udtræk komme i den rigtige rækkefølge, så jeg først hiver top-visninger ud, herefter midt og så bund-visninger.
Jeg smider gerne flere point på, hvis der er een der har en "hurtig" løsning.
Synes godt om
Slettet bruger
29. august 2006 - 21:57#11
Hvad med at lave det første udtræk og overføre det til en temp-tabel, påføre placering og så køre det næste udtræk, som IKKE er indeholdt i temp-tabel, osv!~)
En anden ting er, at de bannere der skal vises, afhænger af hvilke kategorier en bruger har afkrydset. Hvis der ikke findes 8 bannere i de afkrydsede kategorier, skal de resterende bannere findes i tilfældige kategorier. Så her er jeg vel også nødt til at lave en ny connection til databasen?
Synes godt om
Slettet bruger
29. august 2006 - 22:11#13
Næeh... jeg tror ikke det vil være tungt, det bliver jo relativt hurtige forespørgsler og til sidst så laver du bare en count af din temp-tabel og hvis den er under 8, så fyrer du en sidste forespørgsel af...
Kan du ikke lave tre tabeller: En til bannere som skal i toppen, en til dem som skal på midten og en til dem som skal i bunden?
Hvis du arrangere det sådan at der ikke er nogen gengangere imellem de tre tabeller, vil det være en simpel sag at udtrække det relevante antal fra hver af tabellerne, og derefter UNION'e dem sammen uden at der opstår dubletter.
> nielle Det var selvfølgelig en mulighed.. Jeg vil lige tænke over den. Det er mere fordi jeg er imod at gemme samme emne flere gange, og det vil jo være tilfældet hvis det samme banner skal kunne vises på både top, midt og bundvisning. Så ville jeg jo være nødt til at gemme det samme banner i både top, midt og bund-tabellen.
Bemærk iøvrigt at du jo kan nøjes med at sprede selve bannerne over det tre tabeller.
Resten af oplysningerne kan du vælge at have liggende i en 4. tabel som du joiner med banner-tabellerne, når du skal bruge oplysningerne sammen.
Synes godt om
Slettet bruger
30. august 2006 - 08:01#23
29/08-2006 22:37:22>Ikke hvis det er en lokal tabel og der er opdelt i FE/BE. Der vil ikke være nogen problemer hvis folk sidder med hver deres frontend!~)
nielle> Men en kunde skal kunne købe bannerplads på både top, midt og bund. Derfor kan jeg jo komme ud for at skulle gemme samme banner i både en top, midt og bund-tabel. Men som du selv siger, så er det jo kun nødvendigt med et bannerID og så gemme de resterende oplysninger i en 4. tabel.
SELECT TOP 2 AdvID, AdvImage, AdvName, 1 AS Placering FROM Cust_TradeFairAdvertisements WHERE CategoryID IN (8,10,11,9) AND MaxTop > UsedTop ORDER BY RND(AdvID)
2)
Efterhånden som data trækkes ud af tabellen, opsamles de to id'er i en liste:
Dim brugtAdvID As List(Of Integer) = New List(Of Integer)
(Husk at include System.Collections.Generic)
3)
Man lægger de allerde trukne AdvID'er i brugtAdvID med Add-metoden:
brugtAdvID.Add( ... )
4)
Dernæst ville jeg definere denne funktion, som kan omdanne listen til en komma-separeret tekst-version:
Private Function CSV(ByVal brugtAdvID As List(Of Integer)) As String Dim temp As String = "" For Each advID As Integer In brugtAdvID If temp <> "" Then temp &= "," temp &= advID.ToString() Next
Denne kan bruges sammen med den næste af de ialt 3 SELECT'er:
Dim notIn As String = CSV(brugtAdvID) Dim sql2 As String = _ "SELECT TOP 2 AdvID, AdvImage, AdvName, 2 AS Placering " &_ "FROM Cust_TradeFairAdvertisements " & _ "WHERE CategoryID IN (8,10,11,9) AND AdvID NOT IN (" & notIn & ") AND MaxMiddle > UsedMiddle " & _ "ORDER BY RND(AdvID)"
7)
Når du udtrækker disse bannere, Add()'er du de udtrykne til dem der allerede er i brugtAdvID.
8)
Derefter er det bare at gøre det samme en sidste gang for den 3. SELECT:
notIn As String = CSV(brugtAdvID) Dim sql3 As String = _ "SELECT TOP 4 AdvID, AdvImage, AdvName, 3 AS Placering " & _ "FROM Cust_TradeFairAdvertisements " & _ "WHERE CategoryID IN (8,10,11,9) AND AdvID NOT IN (" & notIn & ") AND MaxBottom > UsedBottom " & _ "ORDER BY RND(AdvID)"
9)
Hvis du endnu engang lægger de udtrukne AdvID i brugtAdvID, har du faktiak alle sammen i den rigtige rækkefølge, og der er ingen grund til efterfølgende at lave en sortering på Placering.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.