Controleer status laatst toegevoegde presentatie per bedrijf

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Hey,

Voor een website ben ik bezig met het opzetten van bedrijfspresentaties. Nu kan een bedrijf meerdere bedrijfspresentaties aanmaken, waarvan er maar hooguit één actief (= weergeven op website) kan zijn.

Ik wil nu van alle laatst toegevoegde presentaties per bedrijf de status (inactief / actief) controleren door middel van één query. Hiermee kan ik aan de beheerder tonen of presentaties nog gekeurd moeten worden.

De presentatietabel ziet er als volgt uit (schematisch en vereenvoudigd):

presentatie_idbedrijf_idpresentatie_toegevoegdpresentatie_actief
1202011-03-26'1'
2212011-03-27'0'
3202011-03-27'0'


Mijn vraag is: hoe kan ik door middel van één query de laatste presentaties per bedrijf opvragen én controleren of deze inactief is? Dus uit bovenstaande tabel zal dan presentatie_id = 3 als resultaat er uit moeten rollen.

Ik dacht zelf aan een query met een GROUP BY, zoiets als dit:

code:
1
2
3
4
5
6
7
8
9
10
SELECT
            presentatie_id
            FROM
                presentaties
            GROUP BY
                bedrijf_id
            HAVING
                presentatie_actief = '0'
            ORDER BY
                presentatie_toegevoegd DESC


Maar ik begrijp niet hoe je per bedrijf de nieuwste presentatie (ongeacht of deze actief of inactief is) kan opvragen en tegelijkertijd kan controleren of deze inactief is.

Kan iemand mij in de goede richting duwen?

[ Voor 6% gewijzigd door radem205 op 30-03-2011 11:58 ]


Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

radem205 schreef op woensdag 30 maart 2011 @ 11:55:
[...]
De presentatietabel ziet er als volgt uit (schematisch en vereenvoudigd):

presentatie_idbedrijf_idpresentatie_toegevoegdpresentatie_actief
1202011-03-26'1'
2212011-03-27'0'
3202011-03-27'0'


Dus uit bovenstaande tabel zal dan presentatie_id = 3 als resultaat er uit moeten rollen.
Nee toch, je wilt het toch per bedrijf weten? Dus je zou verwachten als resultaat:
bedrijf_id   21   presentatie_id 2
bedrijf_id   20   presentatie_id 3

Of begrijp ik je nu toch verkeerd? :)
[...]

Maar ik begrijp niet hoe je per bedrijf de nieuwste presentatie (ongeacht of deze actief of inactief is) kan opvragen en tegelijkertijd kan controleren of deze inactief is.
De dikgedrukte zaken lijken mij tegenstrijdig. Is het niet praktischer om per bedrijf de nieuwste presentatie op te halen én de status van diezelfde presentatie? Dus:

SQL:
1
2
3
4
5
6
7
8
SELECT
            bedrijf_id, MAX(presentatie_id), presentatie_actief
            FROM
                presentaties
            GROUP BY
                bedrijf_id, presentatie_actief
            ORDER BY
                presentatie_id DESC

Bovenstaande is even snel in elkaar geflanst, maar het gaat om het idee. :) Wat je met de presentatie_actief status doet, kun je dan verder op in je code beslissen.

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Nou, op zich begrijp je het wel. Echter wat ik wil is het aantal presentaties dat nog gekeurd moet worden (die dus inactief zijn) weergeven.

Dus:

De laatste presentaties van elk bedrijf uit de database halen, waarbij alleen de presentaties geselecteerd worden die inactief zijn (actief = 0).

Ik weet wel hoe ik dit resultaat door middel van meerdere queries kan behalen, maar ik vraag mij af of dit in één query te doen is.

Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

Oke misschien te simpel gesteld, maar wat dacht je van:
SQL:
1
2
3
4
5
6
7
8
9
10
SELECT
            bedrijf_id, MAX(presentatie_id)
            FROM
                presentaties
            WHERE
                presentatie_actief = '0'
            GROUP BY
                bedrijf_id
            ORDER BY
                presentatie_id DESC

Dan krijg je pér bedrijf, de 'nieuwste' presentatie_id die nog niet actief is. Is dat wat je bedoelt?

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

  • BSTNjitRam
  • Registratie: November 2004
  • Laatst online: 22:25
Het lijk mij dat als de nieuwste ook de actieve is dat je deze dan niet in het overzicht wil zien.
Dus dan zou je zoiets krijgen:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
            SELECT 
            bedrijf_id, MAX(presentatie_id) 
            FROM 
                presentaties p
            WHERE 
                presentatie_actief = '0' 
            AND presentatie_toegevoegd > 
                (
                 SELECT presentatie_toegevoegd 
                 FROM presentaties 
                 WHERE presentatie_actief = '1' 
                 AND bedrijf_id = p.bedrijf_id
                )
            GROUP BY 
                bedrijf_id 
            ORDER BY 
                presentatie_id DESC 

Wishlist Backpack Survivors op Steam !


Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Bedankt voor jullie reacties.
BSTNjitRam schreef op woensdag 30 maart 2011 @ 14:35:
Het lijk mij dat als de nieuwste ook de actieve is dat je deze dan niet in het overzicht wil zien.
Dus dan zou je zoiets krijgen:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
            SELECT 
            bedrijf_id, MAX(presentatie_id) 
            FROM 
                presentaties p
            WHERE 
                presentatie_actief = '0' 
            AND presentatie_toegevoegd > 
                (
                 SELECT presentatie_toegevoegd 
                 FROM presentaties 
                 WHERE presentatie_actief = '1' 
                 AND bedrijf_id = p.bedrijf_id
                )
            GROUP BY 
                bedrijf_id 
            ORDER BY 
                presentatie_id DESC 
Wanneer ik deze query gebruik dan wordt een presentatie van een bedrijf die maar één keer voorkomt in de database niet geselecteerd (aangezien de conditie presentatie_toegevoegd > .... niet voldoet).
Bij meerdere presentaties gaat deze query wel goed.

Heb jij enig idee hoe ik dit kan oplossen? Want met IF werken lijkt mij erg omslachtig, of niet?.

Acties:
  • 0 Henk 'm!

  • BSTNjitRam
  • Registratie: November 2004
  • Laatst online: 22:25
Een OR zou voldoende moeten zijn, gewoon controleren of er een presentatie bestaat met actief = '1'

Is er trouwens een reden waarom je actief veld een char is ipv een bit?

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
            SELECT  
            bedrijf_id, MAX(presentatie_id)  
            FROM  
                presentaties p 
            WHERE  
                presentatie_actief = '0'  
            AND (
                   (
                   presentatie_toegevoegd >  
                    ( 
                    SELECT presentatie_toegevoegd  
                    FROM presentaties  
                    WHERE presentatie_actief = '1'  
                    AND bedrijf_id = p.bedrijf_id 
                    ) 
                   )
                OR (
                    (
                    SELECT presentatie_toegevoegd  
                    FROM presentaties  
                    WHERE presentatie_actief = '1'  
                    AND bedrijf_id = p.bedrijf_id 
                    )
                   IS NULL
                   )
                 ) 
            GROUP BY  
                bedrijf_id  
            ORDER BY  
                presentatie_id DESC 

Wishlist Backpack Survivors op Steam !


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 22-09 13:37

alienfruit

the alien you never expected

Op het werk gebruiken we een tabel die alle openstaande goedkeuringen volgt en indirekt de status van de presentatie:

id, presentation_id, type, state, billed
state is vervolgens: enum('draft','ready','live','modified','archived','denied','invisible')
billed: enum('unbilled','billed','paid')

[ Voor 12% gewijzigd door alienfruit op 31-03-2011 14:10 ]

Pagina: 1