Zwei SQL Queries in einem

Hast du Probleme Admidio einzurichten? Hier kannst du Fragen rund um die Einrichtung stellen.
Antworten
ise
Beiträge: 119
Registriert: 11. Sep 2009, 11:08
Wohnort: Schweiz

Zwei SQL Queries in einem

Beitrag von ise »

Hallo zusammen.
Ich habe eine Frage und zwar möchte ich ein "Standard"-Query mit einem "Admidio"-Query in einem zusammenfassen. Wie krieg ich das hin?
Das "Standard"-Query:

Code: Alles auswählen

SELECT * FROM adm_newsletter ORDER BY timestamp DESC
Das "Admidio"-Query:

Code: Alles auswählen

SELECT mem_leader, usr_id, row1id1.usd_value, row2id2.usd_value, row3id12.usd_value, row4id22.usd_value FROM adm_roles, adm_categories, adm_members, adm_users LEFT JOIN adm_user_data row1id1 ON row1id1.usd_usr_id = usr_id AND row1id1.usd_usf_id = 1 LEFT JOIN adm_user_data row2id2 ON row2id2.usd_usr_id = usr_id AND row2id2.usd_usf_id = 2 LEFT JOIN adm_user_data row3id12 ON row3id12.usd_usr_id = usr_id AND row3id12.usd_usf_id = 12 LEFT JOIN adm_user_data row4id22 ON row4id22.usd_usr_id = usr_id AND row4id22.usd_usf_id = 22 WHERE rol_id IN (35) AND rol_cat_id = cat_id AND cat_org_id = 1 AND mem_rol_id = rol_id AND mem_begin <= "2010-09-19" AND mem_end > "2010-09-19" AND mem_usr_id = usr_id AND usr_valid = 1 AND row4id22.usd_value = "1" ORDER BY mem_leader DESC , row1id1.usd_value ASC
Diese Beiden Queries möchte ich nun in eines zusammenfassen, damit ich diese in einer Liste anzeigen lassen kann.
Kann mir hier jemand behilflich sein?
Vielen Dank!

Gruss
Ise
matzman2000
Former team member
Beiträge: 1087
Registriert: 2. Sep 2007, 17:12
Wohnort: Itzstedt
Kontaktdaten:

Beitrag von matzman2000 »

Hallo Ise,

da die Tabelle adm_newsletter so nicht exiswtiert, sondern Bestandteil Deines Newsletterscripts sein wird, kann ich nur raten wie sie aufgebaut ist. Generell sei gesagt, dass das Zusammenfassen problemlos möglich sein sollte. Vorraussetzung dafür ist aber, dass in Deiner Tabelle ein eindeutiger Kenner vorhanden ist, mit dem sich die verschiedenen Tabellen verbinden lassen. In Deinem Fall könnte das sowas wie eine User-ID o.ä. sein. Die Abfrage würde dann ungefähr wie folgt ergänzt werden:

Code: Alles auswählen

SELECT mem_leader, usr_id, row1id1.usd_value, row2id2.usd_value, row3id12.usd_value, row4id22.usd_value, NEWSLETTER FELD 1, NEWSLETTER FELD 2, ... FROM adm_roles, adm_categories, adm_members, adm_users, NEWSLETTERTABELLE ... WHERE ... adm_users.usrid = NEWSLETTERTABELLE.USERID
Da ich aber Dein genaues Vorhaben nicht kenne (und wie schon gesagt den Aufbau der Newslettertabelle ebenso nicht), ist das erstmal rein theoretisch. Vielleicht muss man auch mit einem JOIN arbeiten, kommt auf die Aufgabenstellung an...

Gruss,
Matze
ise
Beiträge: 119
Registriert: 11. Sep 2009, 11:08
Wohnort: Schweiz

Beitrag von ise »

Hallo matze,
Also meine Newsletter Tabelle ist folgendermassen aufgebaut:
ID: Individuelle User ID (nicht identisch zu der von Admidio)
EMAIL: Email Adresse
HTML: Ob HTML Mails empfangen werden können oder nicht
TIMESTAMP: Eintragszeitpunkt
PRENAME: Vorname
SURNAME: Nachname

weitere Informationen sind in dieser Tabelle nicht vorhanden. Damit sie nicht doppelt angezeigt werden, könnten Vor- sowie Nachname kontrolliert werden... Mal schauen ob ich da was hinkriege wie du mir beschrieben hast.

Melde mich nochmals.
Gruss
Ise
ise
Beiträge: 119
Registriert: 11. Sep 2009, 11:08
Wohnort: Schweiz

Beitrag von ise »

Hallo Matze,
Also, das Query bringt nun keine Fehlermeldungen mehr. Nur bring ich die Daten nun nicht sauber in die Tabelle... Der Aktuelle Code mit dem Query sieht nun folgendermassen aus:

Code: Alles auswählen

$result = mysql_query('SELECT mem_leader, usr_id, row1id1.usd_value, row2id2.usd_value, row3id12.usd_value, row4id22.usd_value, news.id, news.Email, news.html_mail, news.timestamp, news.prename, news.surname FROM adm_newsletter news, adm_roles, adm_categories, adm_members, adm_users LEFT JOIN adm_user_data row1id1 ON row1id1.usd_usr_id = usr_id AND row1id1.usd_usf_id = 1 LEFT JOIN adm_user_data row2id2 ON row2id2.usd_usr_id = usr_id AND row2id2.usd_usf_id = 2 LEFT JOIN adm_user_data row3id12 ON row3id12.usd_usr_id = usr_id AND row3id12.usd_usf_id = 12 LEFT JOIN adm_user_data row4id22 ON row4id22.usd_usr_id = usr_id AND row4id22.usd_usf_id = 22 WHERE rol_id IN (35) AND rol_cat_id = cat_id AND cat_org_id = 1 AND mem_rol_id = rol_id AND mem_begin <= "'.$today.'" AND mem_end > "'.$today.'" AND mem_usr_id = usr_id AND usr_valid = 1 AND row4id22.usd_value = "1" ORDER BY mem_leader DESC , row1id1.usd_value ASC');
$aid = "1";
while($row = mysql_fetch_assoc($result)){
$num=$row['news.id'];
$prename=$row['news.prename'];
$surname=$row['news.surname'];
$mail=$row['news.EMail'];
$html_mail=$row['html_mail'];
$time = $row['news.timestamp'];
  $timestamp = date('d.m.Y',strtotime($time));
echo '<form action="'.$_SERVER[PHP_SELF].'" method="get">
<tr><td width="30">'.$aid.'</td>
<td width="200">'.utf8_encode($prename).' '.utf8_encode($surname).'</td>
<td width="200">'.$mail.'</td><td width="80">';
if ($html_mail=="0"){
echo '<img src="'.THEME_PATH.'/icons/delete.png" alt="Nein" title="Nein">';
}
else {
echo '<img src="'.THEME_PATH.'/icons/icon_tick.gif" alt="Ja" title="Ja">';
}
echo '</td><td width="80">'.$timestamp;
echo '</td><td width="70"><input name="checkbox[]" type="checkbox" id="checkbox[]" value="'.$num.'"></td></tr>';
$aid=$aid+1;
}
Ich habe ja das Problem, dass ich nun aus zwei Tabellen "gleiche" Angaben ziehe. Wie kann ich diese nun sauber untereinander auflisten?
Zuvor hat er so ausgesehen:

Code: Alles auswählen

$result = mysql_query("SELECT * FROM adm_newsletter ORDER BY timestamp DESC");
$aid = "1";
while($row = mysql_fetch_assoc($result)){
$num=$row['id'];
$prename=$row['prename'];
$surname=$row['surname'];
$mail=$row['EMail'];
$html_mail=$row['html_mail'];
$time = $row['timestamp'];
  $timestamp = date('d.m.Y',strtotime($time));
echo '<form action="'.$_SERVER[PHP_SELF].'" method="get">
<tr><td width="30">'.$aid.'</td>
<td width="200">'.utf8_encode($prename).' '.utf8_encode($surname).'</td>
<td width="200">'.$mail.'</td><td width="80">';
if ($html_mail=="0"){
echo '<img src="'.THEME_PATH.'/icons/delete.png" alt="Nein" title="Nein">';
}
else {
echo '<img src="'.THEME_PATH.'/icons/icon_tick.gif" alt="Ja" title="Ja">';
}
echo '</td><td width="80">'.$timestamp;
echo '</td><td width="70"><input name="checkbox[]" type="checkbox" id="checkbox[]" value="'.$num.'"></td></tr>';
$aid=$aid+1;
}
Was ich nun noch ergänzen wollte ist, dass ein Häckchen im Profil den Benutzer ebenfalls in die Empfängerliste des Newsletters hinzufügt. Nur ist das nicht ganz so einfach, wie es aussieht. Oder gibt es irgend eine Möglichkeit durch diese Checkbox im Profil einen Eintrag in eine andere Tabelle zu erzeugen?

Gruss
Ise
matzman2000
Former team member
Beiträge: 1087
Registriert: 2. Sep 2007, 17:12
Wohnort: Itzstedt
Kontaktdaten:

Beitrag von matzman2000 »

Hallo Ise,

warum speicherst Du in der Newsletter-Tabelle den Vornamen, den Nachnamen und die Emailadresse? Die sollten doch im Profil des Benutzers bekannt sein? Dann wäre es deutlich einfacher, statt diesen Angaben einfach die User-ID aus Admidio mit in die Newsletter-Tabelle zu speichern.
Mit dieser Angabe könnte man dann auch eine ganz saubere Verknüpfung zwischen den Tabellen herstellen. Wenn Du Dich auf Werte wie Vor- und Nachname verlässt wird es deutlich komplexer. Diese Angaben sind nicht eindeutig, überlge mal wie oft es wohl "Peter Meier" geben wird etc. ...

Gruss,
Matze
ise
Beiträge: 119
Registriert: 11. Sep 2009, 11:08
Wohnort: Schweiz

Beitrag von ise »

Um den Newsletter erhalten zu können, muss man eben nicht registriert sein. Von daher tragt man sich einfach in ein Formular ein, sobald man dort drin ist, empfängt man den Newsletter. Dafür ist auch die seperate Tabelle. Nun, wenn man sich auf der Seite registriert und den Newsletter erhalten möchte, wollte ich im Profilfeld ein Häkchen setzen lassen, wodurch dann diese registrierten User ebenfalls den Newsletter erhalten.

Evtl. gäbe es da eine sauberere Lösung?!

Gruss
Ise
matzman2000
Former team member
Beiträge: 1087
Registriert: 2. Sep 2007, 17:12
Wohnort: Itzstedt
Kontaktdaten:

Beitrag von matzman2000 »

Ah, verstehe. Dann würde ich empfehlen einfach ein weiteres Feld in die Newslettertabelle mit reinzunehmen: Die Admidio User-ID. Wenn denn ein User auch in Admidio angemeldet ist, kannst Du dort die ID sauber wegschreiben, andernfalls bleibt das Feld halt NULL oder 0...

Damit liesse sich wahrscheinlich etwas kompfortabler händeln. Daraus dann eine Übersicht über alle angemeldeten Newsletteruser zu machen würde bedeuten, nur in den Fällen wo eine Admidio User ID bekannt ist noch eine weitere Schleife zu drehen.
Antworten