/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
GROUP BY, 2 krav
Fra : Kasper Johansen


Dato : 23-05-05 14:12

Hej gruppe.

Jeg har en side (www.partyworm.dk), hvor jeg har et billede-system. På
billedesystemet kan brugerne tilmelde sig pilene, akkurat som på Night Leif,
DKBN eller hvad de nu hedder (princippet er set før).

På forsiden vil jeg gerne vise hvem de sidst tilmeldte på billederne er, så
der kommer lidt dynamik i siden uden at jeg selv skal ind og ændre noget.

Det er i sig selv også let nok ved følgende SQL-sætning.

SELECT * FROM bdk_galleri_regged ORDER BY nr DESC

Derfra får jeg så mit brugerid og mit billedeid, der fortæller hvilket
billede brugeren er tilmeldt og hvilken bruger det er.

Problemet ligger i at brugerne mange gange tilmelder sig flere billeder på
en gang (måske en 5-6 stykker). Da jeg kun vil vise de sidste 6 tilmeldte
kan det derfor nemt ske at der kun vises en bruger der har tilmeldt sig 6
billeder (lidt kedeligt, da man meget gerne skulle se lidt flere). Derfor
laver jeg en "GROUP BY userid".

Dertil kommer endnu et problem, at flere brugere kan tilmelde sig på et det
samme billeder (altså kan det ske at det samme billeder opstår 3 gange på de
ialt 6 felter, hvilket igen er lidt kedeligt. Lige meget hvad jeg gør syntes
jeg kun at kunne lave "GROUP BY" på enten userid eller pictureid (altså jeg
kan ikke vælge begge, altså at en bruger kun må optræde en gang, og et
billede kun må optræde en gang).

Indtil videre har min løsning været at lave 6 forskellige queryes, hvilket
så absolut ikke er optimalt (da jeg skal sidde og huske hvilket billede der
har optrådt før, ligesom jeg skal huske de brugere der har optrådt før).

Indtil videre ser min forespørgsel derfor således ud (den virker ikke ved
GROUP BY). Er der nogen der kan lige umidddelbart kan se en løsning på mit
problem?

SELECT
bdk_galleri_pictures.nr,
bdk_galleri_pictures.groupid,
bdk_galleri_pictures.pers,
bdk_galleri_groups.disid,
bdk_galleri_regged.voteid,
bdk_galleri_groups.title,
bdk_galleri_groups.dato,
bdk_users.nick

FROM
bdk_galleri_regged,
bdk_galleri_pictures,
bdk_galleri_groups,
bdk_users

WHERE
bdk_galleri_pictures.nr = bdk_galleri_regged.pid &&
bdk_galleri_regged.userid = bdk_galleri_regged.userid &&
bdk_users.nr = bdk_galleri_regged.userid &&
bdk_users.anonym = '0' &&
bdk_galleri_groups.nr = bdk_galleri_pictures.groupid &&
bdk_galleri_pictures.frontpage = '1'
bdk_users.nick

GROUP BY
bdk_users.nr,
bdk_galleri_pictures.nr


Siden hvor den "fejlagtige" query er kan ses på følgende link (et billede
kan optræde 2 gange, det gør det nødvendigvis ikke pga. skiftende indhold,
men det kan altså godt!):
http://partyworm.dk/index.php?show=forside_pics2


Siden hvor jeg laver 6 queryes kan ses på dette link:
http://partyworm.dk/index.php?show=forside_pics

--
Med venlig hilsen
Kasper Johansen

ORDER BY
bdk_galleri_regged.nr DESC

LIMIT
0, 6



 
 
Nikolaj Hansen (23-05-2005)
Kommentar
Fra : Nikolaj Hansen


Dato : 23-05-05 17:14

Kasper Johansen wrote:
> SELECT
> bdk_galleri_pictures.nr,
> bdk_galleri_pictures.groupid,
> bdk_galleri_pictures.pers,
> bdk_galleri_groups.disid,
> bdk_galleri_regged.voteid,
> bdk_galleri_groups.title,
> bdk_galleri_groups.dato,
> bdk_users.nick
>
> FROM
> bdk_galleri_regged,
> bdk_galleri_pictures,
> bdk_galleri_groups,
> bdk_users
>
> WHERE
> bdk_galleri_pictures.nr = bdk_galleri_regged.pid &&
> bdk_galleri_regged.userid = bdk_galleri_regged.userid &&
> bdk_users.nr = bdk_galleri_regged.userid &&
> bdk_users.anonym = '0' &&
> bdk_galleri_groups.nr = bdk_galleri_pictures.groupid &&
> bdk_galleri_pictures.frontpage = '1'
> bdk_users.nick
>
> GROUP BY
> bdk_users.nr,
> bdk_galleri_pictures.nr
>

Ovenstående er ikke wellformed sql.

SELECT
bdk_galleri_pictures.nr,
bdk_galleri_pictures.groupid,
bdk_galleri_pictures.pers,
bdk_galleri_groups.disid,
bdk_galleri_regged.voteid,
bdk_galleri_groups.title,
bdk_galleri_groups.dato,
bdk_users.nick

FROM
bdk_galleri_regged,
bdk_galleri_pictures,
bdk_galleri_groups,
bdk_users

WHERE
bdk_galleri_pictures.nr = bdk_galleri_regged.pid &&
bdk_galleri_regged.userid = bdk_galleri_regged.userid &&
bdk_users.nr = bdk_galleri_regged.userid &&
bdk_users.anonym = '0' &&
bdk_galleri_groups.nr = bdk_galleri_pictures.groupid &&
bdk_galleri_pictures.frontpage = '1'
bdk_users.nick

GROUP BY
bdk_galleri_pictures.nr,
bdk_galleri_pictures.groupid,
bdk_galleri_pictures.pers,
bdk_galleri_groups.disid,
bdk_galleri_regged.voteid,
bdk_galleri_groups.title,
bdk_galleri_groups.dato,
bdk_users.nick

Ovenstående ER wellformed.

Fordi alle de valgte kolonner er med i din group by. Du skal altid enten
have dem med, eller bruge en agreggerende funktion som du kan finde her:

SUM, AVG, MAX, MIN, COUNT. osv.

dvs eks:

select foo,max(bar)
from bar
where foo = 123
group by foo

mvh

Nikolaj Hansen

Nis Jorgensen (23-05-2005)
Kommentar
Fra : Nis Jorgensen


Dato : 23-05-05 20:28

On Mon, 23 May 2005 15:12:10 +0200, "Kasper Johansen"
<kasper@johansen.tdcadsl.dk> wrote:

>Hej gruppe.
>
>Jeg har en side (www.partyworm.dk), hvor jeg har et billede-system. På
>billedesystemet kan brugerne tilmelde sig pilene, akkurat som på Night Leif,
>DKBN eller hvad de nu hedder (princippet er set før).
>
>På forsiden vil jeg gerne vise hvem de sidst tilmeldte på billederne er, så
>der kommer lidt dynamik i siden uden at jeg selv skal ind og ændre noget.
>
>Det er i sig selv også let nok ved følgende SQL-sætning.
>
>SELECT * FROM bdk_galleri_regged ORDER BY nr DESC
>
>Derfra får jeg så mit brugerid og mit billedeid, der fortæller hvilket
>billede brugeren er tilmeldt og hvilken bruger det er.
>
>Problemet ligger i at brugerne mange gange tilmelder sig flere billeder på
>en gang (måske en 5-6 stykker). Da jeg kun vil vise de sidste 6 tilmeldte
>kan det derfor nemt ske at der kun vises en bruger der har tilmeldt sig 6
>billeder (lidt kedeligt, da man meget gerne skulle se lidt flere). Derfor
>laver jeg en "GROUP BY userid".
>
>Dertil kommer endnu et problem, at flere brugere kan tilmelde sig på et det
>samme billeder (altså kan det ske at det samme billeder opstår 3 gange på de
>ialt 6 felter, hvilket igen er lidt kedeligt. Lige meget hvad jeg gør syntes
>jeg kun at kunne lave "GROUP BY" på enten userid eller pictureid (altså jeg
>kan ikke vælge begge, altså at en bruger kun må optræde en gang, og et
>billede kun må optræde en gang).

Jeg tror ikke du har opdaget hvor kompliceret dit problem er. Hvad
hvis fx de sidste registreringer er (forsimplet)

Person Billede
====== =======
A 1
A 2
B 2
C 3
D 4
......

Skal vi vise billede 1 & 2 (og dermed to billeder af A), kun billede 1
(og ikke noget billede af B) eller kun billede 2 (og dermed ikke det
nyeste billede af A)? Det kan selvfoelgelig blive mere kompliceret end
dette eksempel.

Hvis du kan beskrive i ord praecis hvilke kriterier billederne skal
udvaelges efter, tror jeg at jeg kan skrive en query til dig. Naeste
problem bliver saa at faa oversat den til noget som din (ikke angivne
) databasemotor kan koere.


--
Nis Jorgensen
Midlertidigt uden ae oe og aa. Jeg beklager.

Kasper Johansen (23-05-2005)
Kommentar
Fra : Kasper Johansen


Dato : 23-05-05 21:01

"Nis Jorgensen" <nis@superlativ.dk> skrev i en meddelelse
news:bta491dredpgghltunikilogighoq1nsub@4ax.com...
> Person Billede
> ====== =======
> A 1
> A 2
> B 2
> C 3
> D 4
> ......
>
> Skal vi vise billede 1 & 2 (og dermed to billeder af A), kun billede 1
> (og ikke noget billede af B) eller kun billede 2 (og dermed ikke det
> nyeste billede af A)? Det kan selvfoelgelig blive mere kompliceret end
> dette eksempel.

> Hvis du kan beskrive i ord praecis hvilke kriterier billederne skal
> udvaelges efter, tror jeg at jeg kan skrive en query til dig. Naeste
> problem bliver saa at faa oversat den til noget som din (ikke angivne
> ) databasemotor kan koere.

Jeg beklager selvfølgelig at jeg ikke har skrevet dette. Jeg kører MySQL
4.1.11.

Som jeg ser det, vil det (efter dit eget eksempel) være optimalt med:

A - 1
B - 2
C - 3
D - 4

Forklaringen er den at:

Efter person A har været vist på billede 1, kan A ikke indgå på billede 2.

Næste registreing må være at person B har tilmeldt sig på billede 2, derfor
vises denne på billede 2 (A blev afvist før, så vi tager sådan set bare den
næste registreing der opfylder de givne krav, hvilket denne gør).

De to næste registreringer er åbenlyse, og de accepteres selvfølgelig.

Når limit på 6 er opnået stopper den.

Det ville da være mægtigt, hvis du gad at skrive en hel query paret til min
side. Kommentare og forklaring ville dog klart hjælpe mig en hel del på vej
(så slipper du for at forklare sammen ting en anden gang, eller måske kan
jeg ligefrem hjælpe en anden, ud fra det du har givet mig).


--
Med venlig hilsen
Kasper Johansen



Nis Jorgensen (25-05-2005)
Kommentar
Fra : Nis Jorgensen


Dato : 25-05-05 01:11

On Mon, 23 May 2005 22:00:32 +0200, "Kasper Johansen"
<kasper@johansen.tdcadsl.dk> wrote:

>
>Det ville da være mægtigt, hvis du gad at skrive en hel query paret til min
>side. Kommentare og forklaring ville dog klart hjælpe mig en hel del på vej
>(så slipper du for at forklare sammen ting en anden gang, eller måske kan
>jeg ligefrem hjælpe en anden, ud fra det du har givet mig).

Jo mere jeg kigger paa dit problem, jo mere bliver jeg overbevist om
at den bedste loesning er at lave det i kode - altsaa 6 queries.
Grunden til dette er at det grundlaeggende er en rekursiv algoritme -
om en raekke skal udvaelges afhaenger af hvilke andre raekker der
allerede er udvalgt, ikke bare hvilke raekker der er i tabellen.

SQL er notorisk daarligt til rekursion. Nogle databaser har lavet
deres egne tilfoejelser, men mySQL er svjh ikke en af dem. Og selv da
er din query svaer at skrive.

Det lyder dog som om det ikke goer det store om udvalgsalgoritmen er
lidt "fuzzy" - i givet fald kan du maaske bruge denne:

SELECT *
FROM bdk_galleri_regged bgr1
WHERE pid NOT IN
(SELECT pid FROM bdk_galleri_regged b2 WHERE bgr2.nr > bgr1.nr)
AND user_id NOT IN
(SELECT user_id FROM bdk_galleri_regged b2 WHERE bgr2.nr > bgr1.nr)
ORDER BY b1.nr DESC LIMIT 6

Altsaa: "Udvaelg alle billeder, undtagen dem hvor samme billede er
tilmeldt senere, eller samme bruger er tilmeldt senere"

Bemaerk at dette ikke giver det resultat du beskrev ovenover - den vil
udelukke (B 2) fordi (A 2) er tilmeldt senere - selvom (A 2) er
udelukket pga (A 1). Men som sagt, jeg tror en fuld implementation
bliver for kompliceret.

--
Nis Jorgensen
Midlertidigt uden ae oe og aa. Jeg beklager.

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste