random uit tabel halen
Hoe hoger deze waarde hoe vaker hij in de random moet voortkomen.
Hoe zou ik dat moeten maken?
Ik heb nu dit gemaakt:
Code (php)
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
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
<?php
$sponsorrandqry = "
SELECT
sponsors.logo,
sponsors.waarde
bedrijf.naam,
bedrijf.email,
bedrijf.website
FROM
sponsors
INNER JOIN
bedrijven
ON
sponsors.bedrijf=bedrijven.bedrijfsnummers
WHERE
bedrijven.taal='".$lang."'
ORDER BY RAND()
LIMIT 5";
$sponsorrandsql= mysql_query($sponosrrandqry, $connection);
if($sponsorrandsql === false)
{
echo("Er ging iets fout met de query: ".mysql_error($connection)." (".sponsorrandqry.")");
}
else
{
}
?>
$sponsorrandqry = "
SELECT
sponsors.logo,
sponsors.waarde
bedrijf.naam,
bedrijf.email,
bedrijf.website
FROM
sponsors
INNER JOIN
bedrijven
ON
sponsors.bedrijf=bedrijven.bedrijfsnummers
WHERE
bedrijven.taal='".$lang."'
ORDER BY RAND()
LIMIT 5";
$sponsorrandsql= mysql_query($sponosrrandqry, $connection);
if($sponsorrandsql === false)
{
echo("Er ging iets fout met de query: ".mysql_error($connection)." (".sponsorrandqry.")");
}
else
{
}
?>
Gewijzigd op 26/05/2013 02:28:30 door J C
Bedoel je dat een sponsor die méér heeft bijgedragen vaker wordt geselecteerd?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
RAND() * waarde AS weegfactor,
sponsors.logo,
sponsors.waarde,
bedrijf.naam,
bedrijf.email,
bedrijf.website
FROM
sponsors
JOIN
.....
.....
ORDER BY weegfactor DESC
RAND() * waarde AS weegfactor,
sponsors.logo,
sponsors.waarde,
bedrijf.naam,
bedrijf.email,
bedrijf.website
FROM
sponsors
JOIN
.....
.....
ORDER BY weegfactor DESC
Je moet dan even testen of je dan het gewenste resultaat krijgt, zo niet dan kan je bv de hogere waardes * 2 geven.
@ ger dank je wel, ga er mee aan de slag, alleen testen bij rand is erg moeilijk, nu al geeft hij soms een aantal keer dezelfde resultaten weer.
Ik maakte die opmerking over het testen omdat in mijn eerdere voorbeeld heel veel afhangt van hoe groot het verschil in waarde in is.
Dus ik dacht er aan om het bedrag door 100 te delen en dat als waarde te nemen.
Gewijzigd op 26/05/2013 17:50:47 door J C
• Als een bepaalde sponsor toevallig (te) vaak is getoond, dan moet de kans dat een andere sponsor wordt getoond worden verhoogd. Als de hoofdsponsor A bijvoorbeeld twee keer vaker moet worden getoond dan sponsor B, dan is de verhouding 2/3e A en 1/3e B, maar moet B worden bevoordeeld als alleen A al 3/4e of 4/5e van de pageviews is getoond.
• Dit geldt vaak niet alleen voor het gehele model. Je kunt niet slechts uitgaan van de gehele populatie (alle pageviews), maar wilt bijvoorbeeld ook voorkomen dat de ene bezoeker uitsluitend sponsor A ziet en de andere bezoeker enkel en alleen B.
Dat delen heeft niet zoveel zin.
RAND() geeft een decimaal tussen 0 en 1, met 12 cijfers achter de komma.
Of je nu 0,123456789012 * 1500 doet of maal 15 dan schuift in het eerste geval alleen de komma op.
@Ward,
Dat weet ik, maar de vraagstelling van TS(JC) was hoe ie die waarde kon laten meewegen in de random. Ik heb daar een mogelijkheid voor gegeven, en daar ook een paar maaren aan toegevoegd.
Laat niet weg dat ik het met je eens ben om de vertoningen bij te houden
Puntentelling toevoegen en tabel met (laatst) getoonden. Kan je eventueel ook bijhouden wanneer er op geklikt is.
Kan ik dat met een simpele rekensom doen?
Ik heb er gisteren heel wat uurtjes in gestoken, vooral met het zoeken op internet, maar ben inmiddels het spoor behoorlijk bijster.
edit misschien begrijp ik het:
Ik sla de bedrijfsnummers van de bedrijven op in een tabel. Zodat ik dan kan zien hoevaak ze gezien zijn.
Dan kan ik uitlezen hoevaak alles gezien is.
Maar hoe ga ik dat dan combineren met wat er gezien moet gaan worden?
Ik heb dit deel even gemaakt, zodat ik vanuit daar verder kan ontwikkelen:
Code (php)
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
$sponsors ='';
$sponsorrandqry = "
SELECT
sponsors.logo,
sponsors.waarde,
bedrijven.naam,
bedrijven.bedrijfsnummer,
bedrijven.linknaam
FROM
sponsors
INNER JOIN
bedrijven
ON
sponsors.bedrijf=bedrijven.bedrijfsnummer
WHERE
bedrijven.taal='".$lang."'
ORDER BY RAND()
LIMIT 5";
$sponsorrandsql= mysql_query($sponsorrandqry, $connection);
if($sponsorrandsql === false)
{
echo("Er ging iets fout met de query: ".mysql_error($connection)." (".$sponsorrandqry.")");
}
else
{
WHILE ($sponsorrandom = mysql_fetch_array($sponsorrandsql))
{
$sponsors.= '<a href="/'.$lang.'/'.$sponsorrandom['linknaam'].'"><img src="/logos/'.$sponsorrandom['logo'].'.jpg" height="80" width="80" alt="'.$sponsorrandom['naam'].'" /></a>';
$qry="
INSERT INTO
sponsorshow
Set
bedrijfsnummer = '".mysql_real_escape_string($sponsorrandom['bedrijfsnummer'])."',
ip = '".$_SERVER['REMOTE_ADDR']."'
";
$sql = mysql_query($qry);
if($sql === false)
{
echo (" Er gaat iets mis in (".$qry.")".mysql_error());
}
}
}
$sponsorrandqry = "
SELECT
sponsors.logo,
sponsors.waarde,
bedrijven.naam,
bedrijven.bedrijfsnummer,
bedrijven.linknaam
FROM
sponsors
INNER JOIN
bedrijven
ON
sponsors.bedrijf=bedrijven.bedrijfsnummer
WHERE
bedrijven.taal='".$lang."'
ORDER BY RAND()
LIMIT 5";
$sponsorrandsql= mysql_query($sponsorrandqry, $connection);
if($sponsorrandsql === false)
{
echo("Er ging iets fout met de query: ".mysql_error($connection)." (".$sponsorrandqry.")");
}
else
{
WHILE ($sponsorrandom = mysql_fetch_array($sponsorrandsql))
{
$sponsors.= '<a href="/'.$lang.'/'.$sponsorrandom['linknaam'].'"><img src="/logos/'.$sponsorrandom['logo'].'.jpg" height="80" width="80" alt="'.$sponsorrandom['naam'].'" /></a>';
$qry="
INSERT INTO
sponsorshow
Set
bedrijfsnummer = '".mysql_real_escape_string($sponsorrandom['bedrijfsnummer'])."',
ip = '".$_SERVER['REMOTE_ADDR']."'
";
$sql = mysql_query($qry);
if($sql === false)
{
echo (" Er gaat iets mis in (".$qry.")".mysql_error());
}
}
}
Gewijzigd op 26/05/2013 18:07:42 door J C
Code (php)
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
$sql = "SELECT
sponsors.logo,
bedrijf.naam,
bedrijf.email,
bedrijf.website
FROM ";
// nu een subquery met de verhouding waarde / getoonde ads
$sql .= "
(SELECT bedrijf_id, s.logo,
s.waarde / IF(COUNT(s.bedrijf_id)=0, 1, COUNT(s.bedrijf_id)) verhouding
FROM
bedrijven b
LEFT JOIN
sponsorshow s
USING (bedrijf_id)
ORDER BY verhouding DESC
LIMIT 5) sponsors";
// je kan dan aan verhouding nog een extra deelsom toevoegen, bv 5 per vertoning
// tot slot nog even de bedrijven tabel joinen
$sql .= "JOIN bedrijven
USING (bedrijf_id)";
// daarna zou je ze nog in een willekeurige volgorde kunnen plaatsen:
$ sql .= "ORDER BY RAND()";
?>
$sql = "SELECT
sponsors.logo,
bedrijf.naam,
bedrijf.email,
bedrijf.website
FROM ";
// nu een subquery met de verhouding waarde / getoonde ads
$sql .= "
(SELECT bedrijf_id, s.logo,
s.waarde / IF(COUNT(s.bedrijf_id)=0, 1, COUNT(s.bedrijf_id)) verhouding
FROM
bedrijven b
LEFT JOIN
sponsorshow s
USING (bedrijf_id)
ORDER BY verhouding DESC
LIMIT 5) sponsors";
// je kan dan aan verhouding nog een extra deelsom toevoegen, bv 5 per vertoning
// tot slot nog even de bedrijven tabel joinen
$sql .= "JOIN bedrijven
USING (bedrijf_id)";
// daarna zou je ze nog in een willekeurige volgorde kunnen plaatsen:
$ sql .= "ORDER BY RAND()";
?>
Dit betekent wel dat je in het begin altijd (afhankelijk van de waarde) dezelfde 5 sponsors te zien krijgt.
PS.
De IF statement is om een delen door nul te voorkomen.
Gewijzigd op 26/05/2013 19:05:21 door Ger van Steenderen
En moet ik nu een tabel aanmaken dat verhouding heet?
Klopt het dat er nu 2 keer FROM staat?
als ik een echo maak van de sql krijg i dit:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
SELECT
sponsors.logo,
bedrijf.naam,
bedrijf.email,
bedrijf.website
FROM
(SELECT bedrijf_id, s.logo, s.waarde / IF(COUNT(s.bedrijf_id)=0, 1, COUNT(s.bedrijf_id)) verhouding
FROM
bedrijven b
LEFT JOIN
sponsorshow s
USING
(bedrijf_id)
ORDER BY
verhouding DESC LIMIT 5)
sponsors
JOIN
bedrijven
USING
(bedrijf_id)
ORDER BY RAND()
?>
SELECT
sponsors.logo,
bedrijf.naam,
bedrijf.email,
bedrijf.website
FROM
(SELECT bedrijf_id, s.logo, s.waarde / IF(COUNT(s.bedrijf_id)=0, 1, COUNT(s.bedrijf_id)) verhouding
FROM
bedrijven b
LEFT JOIN
sponsorshow s
USING
(bedrijf_id)
ORDER BY
verhouding DESC LIMIT 5)
sponsors
JOIN
bedrijven
USING
(bedrijf_id)
ORDER BY RAND()
?>
Gewijzigd op 26/05/2013 22:51:15 door J C
Mag ik dit nog een keer onder de aandacht brengen?
De s is een alias, dan hoef je ipv telkens de gehele tabelnaam op te geven alleen de s op te geven.
Ook verhouding is een alias voor de formule die de verhouding waarde/getoond berekent.
Er staat inderdaad 2x FROM, de tweede FROM staat in een subquery.
Met die subquery genereer je een virtuele tabel met daarin de 5 sponsors die het meest in aanmerking komen voor een vertoning.
Let op dat dit pas redelijk gaat werken als elke sponsor 2 of meer maal vertoond is.
Er zaten nog wat fouten in de query, zo zou ie moeten werken:
Code (php)
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SELECT
sponsors.logo,
bedrijven.naam,
bedrijven.email,
bedrijven.website
FROM
(SELECT
bedrijf_id,
s.logo,
s.waarde / IF(COUNT(sh.bedrijf_id)=0, 1, COUNT(sh.bedrijf_id)) AS verhouding
FROM
sponsors AS s
LEFT JOIN
sponsorshow AS sh
USING (bedrijf_id)
GROUP BY
bedrijf_id, s.logo
ORDER BY
verhouding DESC
LIMIT 5
) AS sponsors
JOIN
bedrijven
USING (bedrijf_id)
ORDER BY RAND()
sponsors.logo,
bedrijven.naam,
bedrijven.email,
bedrijven.website
FROM
(SELECT
bedrijf_id,
s.logo,
s.waarde / IF(COUNT(sh.bedrijf_id)=0, 1, COUNT(sh.bedrijf_id)) AS verhouding
FROM
sponsors AS s
LEFT JOIN
sponsorshow AS sh
USING (bedrijf_id)
GROUP BY
bedrijf_id, s.logo
ORDER BY
verhouding DESC
LIMIT 5
) AS sponsors
JOIN
bedrijven
USING (bedrijf_id)
ORDER BY RAND()