SilentWarrior
Erfahrenes Mitglied
Hallo zusammen,
Ich stehe vor einem Problem, bei dem meine mittelmässigen SQL-Kenntnisse leider nicht mehr ausreichen.
Die Situation: Es gibt eine Tabelle UR_USER sowie eine Tabelle UH_USER_HISTORY. Jedesmal, wenn eine Zeile z in UR_USER upgedated oder neu eingefügt wird, wird in UH_USER_HISTORY eine Kopie von z abgelegt.
Jetzt möchte ich gerne UH_USER_HISTORY traversieren und herausfinden, welche Daten sich im Vergleich zum vorherigen Eintrag eines Benutzers geändert haben (also z.B. Vorname, Nachname usw.)
Hier der PHP-Code, der das erledigt (propelbasiert):
Es geht um die sechs Zeilen in der Mitte (die mit den ifs). Wie kann ich sowas in SQL umsetzen? Ich möchte eine View basteln und habe folgenden Query:
Kann mir jemand dabei helfen und mir sagen, was bei den beiden roten Fragezeichen reinkommt? Oder geht mein Vorhaben mit reinem SQL überhaupt nicht?
Vielen Dank für Hilfe und Gruss,
SilentWarrior
Ich stehe vor einem Problem, bei dem meine mittelmässigen SQL-Kenntnisse leider nicht mehr ausreichen.
Die Situation: Es gibt eine Tabelle UR_USER sowie eine Tabelle UH_USER_HISTORY. Jedesmal, wenn eine Zeile z in UR_USER upgedated oder neu eingefügt wird, wird in UH_USER_HISTORY eine Kopie von z abgelegt.
Jetzt möchte ich gerne UH_USER_HISTORY traversieren und herausfinden, welche Daten sich im Vergleich zum vorherigen Eintrag eines Benutzers geändert haben (also z.B. Vorname, Nachname usw.)
Hier der PHP-Code, der das erledigt (propelbasiert):
PHP:
foreach (UhUserHistoryPeer::doSelect(new Criteria) as $event)
{
$c = new Criteria();
$c->add(UhUserHistoryPeer::UR_ID, $event->getUrId());
$c->add(UhUserHistoryPeer::CREATED_AT, $event->getCreatedAt(), Criteria::LESS_THAN);
$c->addDescendingOrderByColumn(UhUserHistoryPeer::CREATED_AT);
$prev = UhUserHistoryPeer::doSelectOne($c);
$changes = array();
if ($event->getUhUsername() != $prev->getUhUsername()) $changes['username'] = $event->getUhUsername();
if ($event->getUhFirstName() != $prev->getUhFirstName()) $changes['first_name'] = $event->getUhFirstName();
if ($event->getUhLastName() != $prev->getUhLastName()) $changes['last_name'] = $event->getUhLastName();
if ($event->getUhEmail() != $prev->getUhEmail()) $changes['e-mail_address'] = $event->getUhEmail();
if ($event->getUhSite() != $prev->getUhSite()) $changes['site'] = $event->getUhSite();
if ($event->getUhStatus() != $prev->getUhStatus()) $changes['status'] = $event->getUhStatus();
if (empty($changes)) continue;
$tmp['username'] = $event->getUsername();
$tmp['createdat'] = $event->getCreatedAt('U');
$tmp['description'] = 'The following was changed:<ul>';
foreach ($changes as $k => $change)
{
if ($k == 'status')
{
$change = sfConfig::get("app_userstatus_$change");
}
$tmp['description'] .= '<li>'.str_replace('_', ' ', ucfirst($k)).' was set to '.$change.'</li>';
}
$tmp['description'] .= '</ul>';
$tmp['triggeredby'] = '';
$this->history[] = $tmp;
}
Es geht um die sechs Zeilen in der Mitte (die mit den ifs). Wie kann ich sowas in SQL umsetzen? Ich möchte eine View basteln und habe folgenden Query:
Code:
SELECT
UR_USER.UR_ID AS ID,
UR_USER.CREATED_AT AS CREATED_AT,
'The following was changed:<ul>?</ul>' AS EVENT,
'' AS TRIGGERED_BY
FROM
UR_USER
WHERE
?
Kann mir jemand dabei helfen und mir sagen, was bei den beiden roten Fragezeichen reinkommt? Oder geht mein Vorhaben mit reinem SQL überhaupt nicht?
Vielen Dank für Hilfe und Gruss,
SilentWarrior