Avatar billede skovtrold Nybegynder
29. august 2006 - 15:40 Der 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?
Avatar billede nielle Nybegynder
29. august 2006 - 16:05 #1
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.

Snakker vi ASP eller hvad?
Avatar billede skovtrold Nybegynder
29. august 2006 - 16:21 #2
Vi snakker .NET

Det vil være ok hvis der skulle noget programmering til.
Har du da en idé så?
Avatar billede nielle Nybegynder
29. august 2006 - 16:57 #3
C# eller VB.Net ?
Avatar billede terry Ekspert
29. august 2006 - 17:29 #4
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.
Avatar billede kjulius Novice
29. august 2006 - 19:26 #5
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*
Avatar billede terry Ekspert
29. august 2006 - 19:45 #6
ah, maybe I've misunderstood the question. So you just want 8 random? Then I'de go for kjulius solution
Avatar billede nielle Nybegynder
29. august 2006 - 19:54 #7
Det ville også være en god ide hvis det kan lade sig gøre, men som man kan se så har ingen af dem den samme WHERE-del.
Avatar billede kjulius Novice
29. august 2006 - 20:40 #8
Damn!! Det havde jeg helt overset. Okay, så er der vist kun tre separate forespørgsler tilbage og noget program-logik tilbage...
Avatar billede skovtrold Nybegynder
29. august 2006 - 21:13 #9
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.
Avatar billede skovtrold Nybegynder
29. august 2006 - 21:16 #10
Jeg smider gerne flere point på, hvis der er een der har en "hurtig" løsning.
Avatar billede 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!~)
Avatar billede skovtrold Nybegynder
29. august 2006 - 22:06 #12
Vil det ikke være tungt?

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?
Avatar billede 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...
Avatar billede Slettet bruger
29. august 2006 - 22:13 #14
dcount!~)
Avatar billede skovtrold Nybegynder
29. august 2006 - 22:33 #15
Når du siger temp-tabel, mener du så en helt ny tabel som jeg blot skal bruge til at opsamle i?
Avatar billede Slettet bruger
29. august 2006 - 22:34 #16
Ja, en lokal tabel, som du tømmer inden brug..
Avatar billede skovtrold Nybegynder
29. august 2006 - 22:37 #17
Men der kan jo være en del brugere som er på, på samme tid - vil det ikke give problemer?
Avatar billede nielle Nybegynder
29. august 2006 - 23:02 #18
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.
Avatar billede Slettet bruger
29. august 2006 - 23:03 #19
Jeg er nød til at smutte!~)
Avatar billede skovtrold Nybegynder
29. august 2006 - 23:29 #20
> 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.
Avatar billede nielle Nybegynder
30. august 2006 - 00:03 #21
Pointen er jo netop at du ikke gemmer samme banner nogen steder. Et banner ryger enten i top-, midt- eller bund-tabellen.

På den måde er det nemt at udtrække 2 x 2 x 4 bannere fra de tre tabeller og undgår dubletter.
Avatar billede nielle Nybegynder
30. august 2006 - 00:12 #22
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.
Avatar billede 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!~)
Avatar billede skovtrold Nybegynder
30. august 2006 - 08:23 #24
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.
Avatar billede nielle Nybegynder
30. august 2006 - 09:18 #25
Jeg ville gøre det sådan:


1)

Først udføres SELECTE'en:

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

    Return temp
End Function

5)

Eksempel:

brugtAdvID.Add(7)
brugtAdvID.Add(9)
brugtAdvID.Add(13)

- betyder at CSV(brugtAdvID) returnere "7,9,13".

6)

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.
Avatar billede Slettet bruger
08. september 2006 - 08:30 #26
Hvad finder du ud af!~)
Avatar billede nielle Nybegynder
20. september 2006 - 20:35 #27
Hvad med noget respons?
Avatar billede skovtrold Nybegynder
28. september 2007 - 11:34 #28
Hej nielle,

Du må undskylde det sene svar.
Hvis du svarer, kan jeg give dig pointene.
Avatar billede nielle Nybegynder
28. september 2007 - 22:41 #29
Svar :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester