SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

Websites optimieren für Google & Co.

Websites optimieren für Google & Co. zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > MySQL/MySQLi

MySQL/MySQLi Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQL/MySQLi diskutieren

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 18.02.2018, 11:25:15
Peter69 Peter69 ist offline
Anfänger
 
Registriert seit: Feb 2018
Alter: 51
Beiträge: 6
Duplikate löschen

Guten Tag,

vielen Dank vorab für alle Tips.
Ich habe folgendes Problem:

Ich habe eine Tabelle

id |pos_id |pos |edit_time
1 |1 |1 |1518862618
2 |2 |2 |1518862618
3 |3 |3 |1518862618
4 |1 |1 |1518862518
5 |2 |2 |1518862518
6 |3 |5 |1518862518
7 |1 |1 |1518862718
8 |2 |2 |1518862718
9 |3 |1 |1518862718


pos_id ist die Referenz auf eine andere Tabelle
pos ist die aktuelle Position des Eintrages
edit_time ist der Unix Timestamp der Einragung

Dahinter verbirgt sich eine Tabelle, die durch Änderung des Wertes in pos umsortiert werden kann.
Ich möcht nun loggen, wie Werte umsortiert wurden.
Was ich gerne ereichen würde ist, den letzten Eintrag zur einer pos_id löschen, wenn sich der Wert in pos beim vorletzen Eintrag nicht geändert hat /je pos_id).

Um bei meiner Tabelle zu bleiben, sollte diese also nach der Aktion wie folgt aussehen:

id |pos_id |pos |edit_time
3 |3 |3 |1518862618
6 |3 |5 |1518862518
9 |3 |1 |1518862718

Man sieht also, dass der Datensatz "3" insgesamt 3 x geändert wurde.


Vielen Dank für einen Tip hierzu

LG

Peter
Mit Zitat antworten
  #2  
Alt 18.02.2018, 14:30:25
Benutzerbild von vt1816
vt1816 vt1816 ist offline
Administrator
 
Registriert seit: Jul 2004
Beiträge: 3.680
AW: Duplikate löschen

Hallo und willkommen hier im Forum.

Kann Dein Wunsch/Problem mit der jetzigen Beschreibung und den Beispielen noch nicht nachvollziehen. So wie Du es beschreibst, sollten doch mehr Datensätze übrig bleiben. Oder bezieht sich Dein gewünschtes Ergebnis nur auf pos_id = 3? Was ist mit pos_id = 1 bzw. 2?

Von wieviel Datensätzen sprechen wir hier?
Wie oft soll das durchgeführt werden?
Wie/wodurch werden die Datensätze angefügt?
Kann beim Anfügen schon auf Duplikat geprüft werden?
Wird eine pos_id gleichzeitig von mehreren Usern geändert/umsortiert?
__________________
Gruss vt1816
Erwarte nicht, dass sich jemand mehr Mühe mit der Antwort gibt als Du Dir mit der Frage.
. . . . . Feedback wäre wünschenswert

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.
Ansosnten gilt: Hilfe ausserhalb dieses Thread (PN, WhatsApp, Skype, Mail, ICQ, etc...) nur per Barzahlung oder Vorauskasse!

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #3  
Alt 19.02.2018, 07:56:20
Peter69 Peter69 ist offline
Anfänger
 
Registriert seit: Feb 2018
Alter: 51
Beiträge: 6
AW: Duplikate löschen

Guten Morgen,

vielen Dank für Deine Hilfe und die freundliche Begrüßung.

Ich habe eine Tabelle mit ca. 250 Datensätzen.
Diese Tabelle ist das Ergebnis einer Selektion auf eine Tabelle mit ca. 15.000 Datensätzen.

Das Skript an dem ich gerade arbeite erlaubt dem Benutzer, die 250 Datensätze umzusortieren.
Es wird immer nur ein Benutzer zeitgleich Datensätze umsortieren.
Mein Skript geht aktuell her und macht nach einer Änderung ein Update auf von "pos"

PHP-Code:
if($action == "updateCustomerPos")

  
$counter 1;
  foreach (
$updRecArray as $recordIDValue
  {
    
$q_update $db->query("UPDATE Kunden SET pos = " $counter " WHERE id = " $recordIDValue);
    
$counter++; 
  }
  echo 
'Position gespeichert';

Soweit alles bestens.
Jetzt kam der Wunsch auf zu wissen, welcher Benutzer einen Datensatz verschoben hat.
Daher habe ich mir nachdem Update einen Insertbefehl eingebaut.

PHP-Code:
$q_history $db->query("INSERT INTO otrsplan_history (pos_id, pos, edit_by, edit_time) VALUES ('" $recordIDValue "','" $counter "','" $benutzer "','" $timestamp "')"); 
Dieser erzeugt meinen Log.

Das Problem ist nun:
Bei jeder Änderung schreibt der Insert Befehl 250 Zeilen in die Datenbank.
Auch dann, wenn isch eigentlich gar nix ändert.

Bsp: ich schiebe Pos 2 an Pos 1

Dann schreibt der Insert Befehl 250 Datensätze aber nur bei den ersten beiden hat sich die Position um Vergleich zum letzen Eintrag geändert.
248 Datensätze sind sinnfrei für das Logging.

Ich würde jetzt gerne hergehen und die sinnfreien Daten löschen.

PHP-Code:
Delet from otrsplan_history where "pos je pos_id mit MAX(timestamp) = "pos je pos_id mit MAX(timestamp)-
Das ganze würde ich dann direkt nach dem Insert durchführen.

Sollte mein Ansatz an sich falsch sein, bitte ich um Nachsicht...

Vielen Dank und LG

Peter
Mit Zitat antworten
  #4  
Alt 19.02.2018, 09:24:27
sysop sysop ist offline
Member
 
Registriert seit: Mar 2004
Ort: wien
Beiträge: 512
AW: Duplikate löschen

Der timestamp ist vollkommen für die Katz, weil überall das selbe Datum steht.

Wieso gehst du denn alle Daten durch? Das entscheidest du doch bei deinem Sortierscript, wie immer du auch die beiden Datensätze markierst, die verschoben werden sollen.
Den Timestamp nur bei den verschobenen Daten aktualisieren und schon lasen sich die Daten nach dem letzten Sortierdatum gruppieren.

Zitat:
id |pos_id |pos |edit_time
1 |1|1 |1518862618
2 |2 |2 |1518862618
4 |1 |1 |1518862518
5 |2 |2 |1518862518
.
.
Die Daten sind bis auf die id (erste Spalte) vollkommen identisch, damit wäre das Design deiner Datenbank in meinen Augen falsch. Normalisieren wäre da das Zauberwort.
Da pos_id ein Fremdschlüssel ist, dürfte nach meiner Auffassung jede pos_id nur einmal in der Tabelle vorkommen.

Daher würde ich hier einen zusammengesetzten primary-Key aus pos_id und pos machen.
__________________
Gruss sys ;-)
Ich möchte wie mein Grossvater sterben, lächelnd und schlafend, nicht schreiend und weinend, wie sein Beifahrer.
Mit Zitat antworten
  #5  
Alt 19.02.2018, 12:54:28
Benutzerbild von vt1816
vt1816 vt1816 ist offline
Administrator
 
Registriert seit: Jul 2004
Beiträge: 3.680
AW: Duplikate löschen

Vorschlag: Passe Dein INSERT entsprechend an, dass nur die aktuall geänderten Datrensätze wirklich protokolliert werden (müssen).
__________________
Gruss vt1816
Erwarte nicht, dass sich jemand mehr Mühe mit der Antwort gibt als Du Dir mit der Frage.
. . . . . Feedback wäre wünschenswert

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.
Ansosnten gilt: Hilfe ausserhalb dieses Thread (PN, WhatsApp, Skype, Mail, ICQ, etc...) nur per Barzahlung oder Vorauskasse!

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #6  
Alt 19.02.2018, 16:12:26
Peter69 Peter69 ist offline
Anfänger
 
Registriert seit: Feb 2018
Alter: 51
Beiträge: 6
AW: Duplikate löschen

@vt1816

Das wollte ich auch schon, scheiter hier aber an der Insert Syntax.

Ich brauche ja in etwa:

PHP-Code:
INSERT INTO log (pos_idposedit_byedit_timeVALUES ('" . $recordIDValue . "','" . $counter . "','" . $benutzer . "','" . $timestamp . "'Where pos_id='" . $recordIDValue . "' and 
pos <> " . $counter . " 
Insert und Where ist aber kein Lösung und was anderes habe ich nicht gefunden.
Hast Du hier einen Lösoungsansatz?
Mit Zitat antworten
  #7  
Alt 19.02.2018, 16:28:09
Benutzerbild von vt1816
vt1816 vt1816 ist offline
Administrator
 
Registriert seit: Jul 2004
Beiträge: 3.680
AW: Duplikate löschen

Wie/wo werden die 250 Datensätze "umsortiert"? Bestimmt mittels Formular?
__________________
Gruss vt1816
Erwarte nicht, dass sich jemand mehr Mühe mit der Antwort gibt als Du Dir mit der Frage.
. . . . . Feedback wäre wünschenswert

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.
Ansosnten gilt: Hilfe ausserhalb dieses Thread (PN, WhatsApp, Skype, Mail, ICQ, etc...) nur per Barzahlung oder Vorauskasse!

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #8  
Alt 19.02.2018, 17:26:39
Peter69 Peter69 ist offline
Anfänger
 
Registriert seit: Feb 2018
Alter: 51
Beiträge: 6
AW: Duplikate löschen

Hallo,
ja ich habe eine Seite mit folgendem Code:

++++++++++++++++++
<script type="text/javascript">
$(document).ready(function()
{
function slideout() {
setTimeout(function() {
$("#debugMess").slideUp("slow", function () {
});
}, 2000);}

$("#debugMess").hide();

$(function() {
$("#customersList").sortable({ placeholder: "customersListHighlight", opacity: 0.5, cursor: 'move', update: function() {
var order = $(this).sortable("serialize") + '&action=updateCustomerPos';
$.post("UpdatePos.php", order, function(theResponse) {
$("#debugMess").html(theResponse);
$("#debugMess").slideDown('slow');
slideout();
});
}
});
$( "#customersList" ).disableSelection();
});
});
</script>
</head>
<body>

<?php
require("inc/db.inc.php");
$showDebugMessage = true;


$q_data = $db->query("SELECT id, CONCAT(tn,' ',title) AS ticket, pos FROM otrsplan ORDER BY pos ASC");
if(mysqli_num_rows($q_data) > 0)
{
echo "<div id=\"wrapper\">\n";
if($showDebugMessage) echo " <div id=\"debugMess\"></div>\n";

echo " <ul id=\"customersList\">\n";
while($r_data = $q_data->fetch_object())
{
echo " <li id=\"recArray_".$r_data->id."\">\n";
echo " <div class=\"customerName\">".$r_data->ticket."</div>\n";
echo " <div class=\"customerName\">".$r_data->pos."</div>\n";
echo " </li>\n";
}
echo " </ul>\n";
echo "</div>";
}
else
{
echo "Es wurde kein Kunde in der Datenbank gefunden";
}
$db->close();
?>
++++++++++++++++++++++++++++++++++++

Diese übergibt die id an das update script
++++++++++++++++++++++++++++++++++++++
<?php
/********************************************************************** ******************
*
Wird aufgerufen wenn die Position eines Eintrages per Drag and Drop veraendert wird. *
*
********************************************************************** ******************/
require("inc/db.inc.php");
require_once("inc/session.php");
$action = $db->real_escape_string($_POST['action']);
$updRecArray = $_POST['recArray'];
$timestamp = time();
$benutzer = $_SESSION['user_id'];

if($action == "updateCustomerPos")
{
$counter = 1;

foreach ($updRecArray as $recordIDValue)

{

$q_update = $db->query("UPDATE otrsplan SET pos = " . $counter . " WHERE id = " . $recordIDValue);
$q_history = $db->query("INSERT INTO otrsplan_history (pos_id, pos, edit_by, edit_time) VALUES ('" . $recordIDValue . "','" . $counter . "','" . $benutzer . "','" . $timestamp . "')");

$counter++;

}

echo $timestamp;
}

$db->Close();
?>
++++++++++++++++++++++++++++++++++++++++++++
Mit Zitat antworten
  #9  
Alt 19.02.2018, 17:54:51
Peter69 Peter69 ist offline
Anfänger
 
Registriert seit: Feb 2018
Alter: 51
Beiträge: 6
AW: Duplikate löschen

Ich habe jetzt einen Select gefunden, der fast alles kann was ich brauche..

Select id, pos, pos_id, edit_by, edit_time FROM otrsplan_history Where Exists (SELECT pos_id FROM otrsplan_history DUP WHERE otrsplan_history.pos = dup.pos AND otrsplan_history.pos_id = dup.pos_id AND otrsplan_history.id <> dup.id)
ORDER BY pos;

liefert mir:

id pos pos_id edit_by edit_time
417 7 1 1 1519057747
7 7 1 1 1519047921
212 7 1 1 1519057714

Wenn ich jetzt noch schaffe, nur den letzten und den vorletzten Eintrag zu selektieren, wäre ich glücklich..

Vielen dank für ein Feedback.

LG

Peter
Mit Zitat antworten
  #10  
Alt 20.02.2018, 07:12:53
chorn chorn ist offline
Junior Member
 
Registriert seit: Apr 2016
Alter: 40
Beiträge: 170
AW: Duplikate löschen

order by x desc limit 2
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Eintrag löschen Yuuki94 PHP Grundlagen 5 20.11.2015 15:15:56
Zip-Datei löschen Melina2008 PHP Grundlagen 7 22.12.2008 15:09:57
mehrere Datensätze löschen (Checkboxen) timo88 PHP für Fortgeschrittene und Experten 1 10.09.2006 14:17:20
Dateiimport zu mysql Lars_oha PHP für Fortgeschrittene und Experten 10 18.09.2003 08:10:51
Verzeichnis inkl. Dateien löschen doudie PHP für Fortgeschrittene und Experten 5 16.11.2002 22:37:10


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:01:44 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.


© 2001-2020 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt