views:

44

answers:

1

Hello. My problem is described further under the table structure.

This is my tables for my advertising banner system:

banner

id (unique key)

title

bannersrc

maxhits

maxklik

activefrom

activeuntil

dato

bannerhits (number of shows)

id (unique key)

ip

bannerid (index) (referring to banner.id)

dato

bannerklik (number of clicks)

id (unique key)

ip

bannerid (index) (referring to banner.id)

dato

question

What I want is to make an query that selects a banner from the table 'banner' WHERE:

(b.usertype = $usertype OR b.usertype = '0')

AND

( activefrom <= now activeuntil >= now

OR

maxklik > number of rows in 'bannerklik' where bannerklik.bannerid = banner.id

OR

maxhits > number of rows in 'bannerhits' where bannerhits.bannerid = banner.id )

Can you create a query for me, because I really don't get how to make that :)

A: 

i think the following should work .. (assuming you have a usertype field in the banner table)

SELECT
     b.id, b.title, b.bannersrc
FROM
     banner b 
     LEFT OUTER JOIN bannerhits bh ON b.id = bh.bannerid
     LEFT OUTER JOIN bannerklik bk ON b.id = bk.bannerid 
WHERE
     (b.usertype = '0' OR b.usertype = $usertype)
     AND 
     (b.activefrom <= curdate() AND b.activeuntil >= curdate())
GROUP BY 
     b.id, b.title, b.bannersrc, b.maxklik, b.maxhits
HAVING
     ( 
      b.maxklik > count( DISTINCT(bk.id) )
      OR
      b.maxhits > count( DISTINCT(bh.id) )
     )

[EDIT 1]

ok lets revise the conditions here..

You want the following conditions to be true at the same time in order to display an ad

  1. b.usertype be '0' or some value you pass in the $usertype variable
  2. any one of the following rules
    1. b.activefrom <= curdate() AND b.activeuntil >= curdate()
    2. b.maxklik > count( DISTINCT(bk.id)
    3. b.maxhits > count( DISTINCT(bh.id)

am i correct ?

Gaby
Thanks a lot.. It seems to work - well at least no mysql-error :P
Dennis Lauritzen
had forgotten the $usertype variable ... added it in ..
Gaby
it will select banners that have usertype 0 or the one you provide, whose active dates include today, and whose maxklik or maxhits are not maxed out
Gaby
Well, it doesn't exactly do what I want :Pthe banners to be selected is:the ones that has maxklik > count(DISTINCT(bk.id))ORmaxhits > count(DISTINCT(bh.id) )ORb.activefrom <= curdate() AND b.activeuntil >= curdate()the b.usertype = '0' OR b.usertype = $usertype is only so the advertisers can have their ad show to a special type of users - if you're usertype 1 you only get showed WHERE usertype = 0 or 1, if it is to usertype = 0 or 2 and so on.
Dennis Lauritzen
ok .. we need to establish the correct grouping of conditions.. i will edit my answer (to have formatting)
Gaby