PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [SQL] Paidmails - User abfragen die nicht in der Reload sind



MrChicken
30.06.2014, 12:48
Es ist Montag und ich kann schon nicht mehr klar denken :-D

Erst mal eben die Tabellen die ich habe:
vms_gebuchte_werbung


uid
tan
menge
werbeart
status
beschreibung


36242
GLOERF
36
paidmail
1
Testmail 1


12345
GLIPSY
1
paidmail
1
Testmail 2


...
...
...
...
...
...



vms_emaildaten


uid
emailadresse
freigabe_fuer


36242
36242@test.test
1


12345
12345@test.test
1


13579
13579@test.test
0


24680
24680@test.test
1


09876
09876@test.test
1



vms_reload


uid
tan
bis


12345
GLOERF
1504192934


...
...
...



So. Was ich möchte:


Es soll eine Paidmail zufällig ausgewählt werden
Diese Paidmail an maximal so viele User zufällige(!) verschickt werden wie noch Paidmails da sind (vms_gebuchte_werbung "menge")
An User verschickt werden, die den Paidmailversand aktiviert haben (vms_emaildaten "freigabe_fuer = 1")
An die User verschickt werden die nicht Eigentümer der Mail sind (also ihre eigene E-Mail sollen sie nicht bekommen (vms_gebuchte_werbung (uid))
An alle User verschickt werden die für diese Mail nicht im Reload sind (vms_reload "bis < time()") ODER überhaupt nicht in der vms_reload stehen


Beispiel 1:
Testmail 1 könnte 36 mal verschickt werden, wird aber nur verschickt an UID 24680 und 09876 (siehe vms_emaildaten) (13579 will keine Paidmails, 12345 ist noch im Reload und 36242 ist der Werbebucher und bekommt die eh nicht).

Beispiel 2:
Testmail 2 könnte 2 mal verschickt werden. UID 36242 bekommt sie und 24680 auch (12345 ist der Eigentümer, 13579 will keine Paidmails, 09876 würde sie theoretisch auch bekommen, aber es gibt nicht genug Mails). Am nächsten Tag (wenn keiner der User im Reload ist und die Mail noch vorhanden ist), würde sie vielleicht an 24680 und 09876 gehen, aber nicht an 36242 (halt zufällig ausgewählt)

1. Krieg ich hin:

$mails = db_query('SELECT * FROM vms_gebuchte_werbung WHERE werbeart = "paidmail" AND menge > 0 AND status = 1 AND uid != 0 ORDER BY RAND() LIMIT 1');
Es wird eine zufällige Paidmail ausgewählt, die von einem User gebucht wurde, aktiv ist und noch geklickt werden kann.
Der Code gibt mir richtigerweise beide Paidmails raus.

Bei dem Rest komm ich aber nicht weiter. Entweder er wählt gar keinen User aus, nur die die in der Reloadsperre sind oder er verschickt sie an alle User die Paidmails wollen inklusive derer die eigentlich schon im Reload sind......

Kann mir jemand helfen und mir den Code geben mit dem ich die User richtig auswähle?

Gruß,
MrChicken

Kraemer84
30.06.2014, 21:01
also glaub nicht das mein code so jetzt direkt funktionert .. müsste man probieren aber mein Denkansatz dürfte so im groben der richtige sein

einfach mal ein Leftjoin direkt in der Abfrage



LEFT JOIN vms_emaildaten on uid.vms_gebuchte_werbung = uid.vms_emaildaten WHERE freigabe_fuer = 1
LEFT JOIN vms_reload on uid.vms_gebuchte_werbung = uid.vms_reload WHERE uid != uid

KundM
02.07.2014, 14:33
Was mir nicht klar ist:


vms_gebuchte_werbung


uid
tan
menge
werbeart
status
beschreibung


12345
GLIPSY
1
paidmail
1
Testmail 2



Beispiel 2:
Testmail 2 könnte 2 mal verschickt werden.


Wieso könnte die 2x verschickt werden, wenn die Menge nur "1" ist?

MrChicken
03.07.2014, 12:40
also glaub nicht das mein code so jetzt direkt funktionert .. müsste man probieren aber mein Denkansatz dürfte so im groben der richtige sein

einfach mal ein Leftjoin direkt in der Abfrage



LEFT JOIN vms_emaildaten on uid.vms_gebuchte_werbung = uid.vms_emaildaten WHERE freigabe_fuer = 1
LEFT JOIN vms_reload on uid.vms_gebuchte_werbung = uid.vms_reload WHERE uid != uid


Ja, mit LEFT JOIN hatte ich auch schon rumprobiert aber es nicht hinbekommen. Habe mal deinen Code als Beispiel genommen und angepasst, aber jetzt werden mir nichtmal mehr die Maileigenschaften angezeigt.... :-/
Irgendwie häng ich da in der Logik fest....


Was mir nicht klar ist:
Wieso könnte die 2x verschickt werden, wenn die Menge nur "1" ist?

Hast natürlich recht, da gehört eine 2 bei Menge hin, war ein Tippfehler (ich kann den Beitrag irgendwie auch nicht mehr bearbeiten?!)

KundM
03.07.2014, 15:09
Ah ok, dann komme ich vielleicht auch dahinter, warum es da heisst:


1. Krieg ich hin:
Code:

$mails = db_query('SELECT * FROM vms_gebuchte_werbung WHERE werbeart = "paidmail" AND menge > 0 AND status = 1 AND uid != 0 ORDER BY RAND() LIMIT 1');

Es wird eine zufällige Paidmail ausgewählt, die von einem User gebucht wurde, aktiv ist und noch geklickt werden kann.
Der Code gibt mir richtigerweise beide Paidmails raus.

Durch das "LIMIT 1" kann ja nur 1 Datensatz zurückgeliefert werden. Ich vermute, du hast mehrere Testläufe gestartet, oder die Abfrage steckt innerhalb einer Schleife (was möglicherweise schon eine unglückliche Lösung wäre; kann aber vom Gesamtcode abhängen).

MrChicken
03.07.2014, 15:13
Ah ok, dann komme ich vielleicht auch dahinter, warum es da heisst:

Durch das "LIMIT 1" kann ja nur 1 Datensatz zurückgeliefert werden. Ich vermute, du hast mehrere Testläufe gestartet, oder die Abfrage steckt innerhalb einer Schleife (was möglicherweise schon eine unglückliche Lösung wäre; kann aber vom Gesamtcode abhängen).

Ja genau. Die Abfrage gibt nur jeweils eine Mail aus (es soll ja nachher auch immer nur 1 Mail verschickt werden), aber wenn man die Abfrage an sich mehrmals ausführt gibt er natürlich auch die andere/alle anderen Mails aus die den Bedingungen entsprechen. Pro Abfrage aber nur eine. Die Abfrage selbst steckt nicht in einer Schleife.

MrChicken
09.07.2014, 13:07
Hat noch irgendjemand eine Idee wie die Abfrage richtig lauten müsste?

Lokutos
12.07.2014, 18:53
$mails = db_query('SELECT * FROM vms_gebuchte_werbung WHERE werbeart = "paidmail" AND menge > 0 AND status = 1 AND uid != 0 ORDER BY RAND() LIMIT 1');

zum Paidmails hast du ja bereits.

nun brauchen wir noch die User.


SELECT * FROM `vms_emaildaten` AS `e`LEFT JOIN `vms_reload` AS `r` ON (`r`.`uid` = `e`.`uid` AND `r`.`tan` = ".$abfrage1['tan']." AND t2.bis >= ".time().")
WHERE `e`.`freigabe_fuer` = 1 AND `e`.`uid` != ".$abfrage1['uid']." AND `r`.`tan` IS NULL
ORDER BY RAND()
LIMIT ".$abfrage1['menge']."


in php:

<?php
$abfrage1 = mysql_fetch_assoc(db_query("SELECT * FROM vms_gebuchte_werbung WHERE werbeart = 'paidmail' AND menge > 0 AND status = 1 AND uid != 0 ORDER BY RAND() LIMIT 1"));
$abfrage2 = db_query("SELECT * FROM `vms_emaildaten` AS `e`
LEFT JOIN `vms_reload` AS `r` ON (`r`.`uid` = `e`.`uid` AND `r`.`tan` = '".$abfrage1['tan']."' AND `r`.`bis` >= ".time().")
WHERE `e`.`freigabe_fuer` = 1 AND `e`.`uid` != ".$abfrage1['uid']." AND `r`.`tan` IS NULL
ORDER BY RAND()
LIMIT ".$abfrage1['menge']."");

while($data = mysql_fetch_assoc($abfrage2)){

$data['emailadresse'];
$abfrage1['gebuchte_werbung spalten'];

}

MrChicken
16.07.2014, 13:04
Hallo,

das funktioniert leider auch nicht, jetzt gibt er mir nichtmal mehr die Eigenschaften der Mailabfrage raus..
Ich glaube ich lass es dann wohl lieber :-(

breaker
21.07.2014, 23:58
Dieses System ist bei mir im orw.Control schon seit Jahren verbaut. Allerdings mit einigen Features mehr,- zb. wechselndes Mail-Templates, Fakeschutz, wirklich eindeutige TANs, Reload vom System, Reload der Kampagnen, Blackliste usw.




$sql1 = $db->setQuery ('SELECT
p.*,
g.code AS ordered,
b.code AS blacklist,
r.reload AS reload
FROM ' . $db->quoteName ('#__paidmails') . ' AS p
LEFT JOIN ' . $db->quoteName ('#__paidmails_ordered') . ' AS g
ON (p.code = g.code)
LEFT JOIN ' . $db->quoteName ('#__blacklist') . ' AS b
ON (p.code = b.code)
AND (b.w_art = ' . $db->escape ('pm') . ')
LEFT JOIN ' . $db->quoteName ('#__paidmails_reload') . ' AS r
ON (p.code = r.code)
WHERE p.sponsor = ' . $db->escape ($this->id) . '
AND p.art = ' . $db->escape ($this->art) . '
GROUP BY p.code
ORDER BY p.ver_admin DESC');