Helpdesk
Menschen Wissenschaft Politik Mystery Kriminalfälle Spiritualität Verschwörungen Technologie Ufologie Natur Umfragen Unterhaltung
weitere Rubriken
PhilosophieTräumeOrteEsoterikLiteraturAstronomieHelpdeskGruppenGamingFilmeMusikClashVerbesserungenAllmysteryEnglish
Diskussions-Übersichten
BesuchtTeilgenommenAlleNeueGeschlossenLesenswertSchlüsselwörter
Schiebe oft benutzte Tabs in die Navigationsleiste (zurücksetzen).

Programmieren: Hilfe & Austausch

920 Beiträge ▪ Schlüsselwörter: Programm, Code, Html ▪ Abonnieren: Feed E-Mail

Programmieren: Hilfe & Austausch

03.02.2013 um 00:20
@AnGSt
Ach so. Hört sich interessant an.
Auch weil man die DB dann für Dictionary-Attacks oder Brute-Force nutzen kann.^^

(Natürlich bräuchte man für Brute-Force auch einen guten mixer-algorithmus, denke ich mal. Hab in der richtung nie programmiert)

Ich weiß, so Viren oder Passwortknacker usw. sind tabu aber docht interessant für forschungszwecke. ;)

Man kann da vieles lernen, was man wo anders für gutes verwenden kann.


melden

Programmieren: Hilfe & Austausch

03.02.2013 um 01:16
ich programmiere Datenbanken in SQL hauptsächlich MySQL und FileMaker !!!


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

05.02.2013 um 16:16
Help! Ich habe ein großes Problem ;)

Erstmal auf Deutsch, was ich machen will ist: Personen sind in Gruppen, mehrere Personen in einer Gruppe und jede Person in mehreren Gruppen. In der Relationstabelle gibt es für diese Zugehörigkeiten immer einen Zeitraum. Nun wenn ich zwei Personen, die sich als doppelt oder mehrfach in der DB enthalten heraus stellen, miteinander zusammenführen will, muss ich natürlich von den Zugehörigkeitszeiträumen jeweils das Minimum und Maximum erhalten und in den Zielpersonsrelationen wieder vermerken. Aber dieses getrennt für jede Gruppe in der die Zielperson dann ist.

Und jetzt technisch: Also die Sache ist die, dass in einer mit der Zugehörigkeitstabelle verwandten anderen Tabelle Autorendaten zusammengeführt werden, also aus mehreren AuthorIDs eine ID wird. Dabei gibt es dann den Fall, dass viele Datumssätze betroffen sind, unter denen es aber auch verschiedene GroupIDs gibt. Es müssten nun nicht einfach nur die Zeiträume aus allen überhaupt betroffenen Datumssätzen vereinigt werden, sondern immer nur bündelweise diejenigen welche eine der betroffenen AuthorIDs haben, aber auch unter sich die selbe GroupID. Es kann ja sein, das Datumssätze mit einer der betroffenen AuthorIDs von sich aus unterschiedliche GroupIDs haben, die aber nach dem Zusammenführen der Autoren für die Ziel-AuthorID eins werden.

Na wenn das mal nicht ohne komplexe Schleifenkonstruktion oder ähnlichem geht ... ich sehe halt noch nicht wie man da am besten vor gehen kann und welche Erleichterungen man durch MYSQL dabei in Anspruch nehmen kann.

(falls noch was unklar ist, bitte einfach fragen) danke


ps: umgekehrt soll das auch funktionieren: denn die Gruppen sind, mit einem anderen Was-Typ, ebenfalls in der 'Personen'-Tabelle gespeichert. AuthorID und GroupID zeigen also auf Datensätze in der Personentabelle. Nun, es soll auch gehen, dass ich nicht Personen, sondern Gruppen zusammen führe...

...bisher habe ich das so gemacht:

$jane->query("UPDATE MEMBERS SET GroupID = $destid WHERE GroupID IN ($sourceids)"); $jane->query("UPDATE MEMBERS SET AuthorID = $destid WHERE AuthorID IN ($sourceids)"); $jane->query("DELETE FROM MEMBERS WHERE GroupID IN ($sourceids)")); $jane->query("DELETE FROM MEMBERS WHERE AuthorID IN ($sourceids)");

Dabei werden aber die Zeträume nicht verwendet wie oben gewünscht.

Dieses hier ist vielleicht ein passabler Ansatz:

SELECT @minDate := MIN(`startDate`) FROM `table` WHERE `groupId` = 123 GROUP BY `groupId`; SELECT @maxDate := MAX(`endDate`) FROM `table` WHERE `groupId` = 123 GROUP BY `groupId`; UPDATE `table` SET `startDate` = @minDate, `endDate` = @maxDate` WHERE `id` = 321;

Es führt Autoren zusammen welche in der selben Gruppe sind und verwendet dabei die größte Zeitspanne.


@Neo123

ok, gut zu wissen ^^


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

05.02.2013 um 18:07
Hier ein Bild, das veranschaulicht, was ich machen will:

c1344d merge

Die Personendatensätze zu 1, 2 und 3 sollen zu einem kombiniert werden. Die erste Person 1 soll dabei das Ziel sein, also nicht gelöscht werden. Wenn man 1 und 2 und 3 kombiniert, muss man die Gruppenmitgliedszeiträume der Verknüpfung z und y zusammen führen, also darin das kleinste und das größte Datum der Mitgliedschaft in den Gruppen A und B ermitteln und in der Verlinkung der Zielperson zur Gruppe A vermerken. Zu diesem merken soll die erste betroffene Verknüpfung, also z verwendet werden (UPDATE), die Verknüpfung y soll gelöscht werden, denn sonst wäre die Zielperson zweimal in Gruppe 1. Die Verknüpfung t soll unberührt bleiben. Die Verknüpfungen x und w müssen ebenfalls zusammen geführt werden, aber unabhängig von der Zusammenführung von z und y. Das Ganze soll für beliebig viele Personen in beliebig vielen Gruppen möglich sein, und man soll auch umgekehrt Gruppen zusammen führen können. Dafür lässt sich im Prinzip genau der selbe Code an wenden, weil die Tabellen so aus sehen:

Die Verknüpfungstabelle vor der Aktion schaut so aus (statt Zahlen habe ich zur Übersichtlichkeit statt der GrupenID die Buchstaben aus obigem Bild ein gesetzt):

Felder: AuthorID, GroupID, Since (Date), Until (Date) (t) 1 D .. .. (z) 1 A .. .. (y) 2 A .. .. (x) 2 B .. .. (w) 3 B .. .. (v) 3 C .. .. (u) 4 C .. ..


Und die Personentabelle, welche auch zugleich die Gruppentabelle ist, sieht so aus:

Felder: ID, Authtype (Datensatz ist Gruppe oder Person), Name, ... 1 0 2 0 3 0 4 0 A 1 B 1 C 1 D 1


Und nach der Zusammenführung der Personen sollen die Tabellen so aus schauen:

Felder: AuthorID, GroupID, Since (Date), Until (Date) (t) 1 D .. .. (z) 1 A .. .. (x) 1 B .. .. (u) 4 C .. .. Felder: ID, Authtype (Datensatz ist Gruppe oder Person), Name, ... 1 0 4 0 A 1 B 1 C 1 D 1


1x zitiertmelden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

05.02.2013 um 18:34
Hier nochmal wie das Ganze nach der Zusammenführung der Personen 1, 2 und 3 aus sehen soll:

918cfa merge


melden

Programmieren: Hilfe & Austausch

05.02.2013 um 19:40
wie hast du den Zugehörikeits-zeitraum moduliert?

Anfangs und End-datum?


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

05.02.2013 um 19:49
@interpreter

Wie meinen? Moduliert? Was? Es gibt für jede Zugehörigkeit ein Anfangs und End-Datum. Vom Typ DATE natürlich.


melden

Programmieren: Hilfe & Austausch

05.02.2013 um 20:45
macht irgendwer mit android rum?

konkreter....

mich interessiert die moeglichkeit mit c/c++ nativ zumindest bibliotheken zu nutzen...

noch konkreter;)

ich bin auf "LibGDX" gestossen...feine sache aber auch...bin aber auch an SDL interessiert...

wuerde mich gerene austauschen darueber wo ich genau was "besser" einsetzten kann/koennte vor/nachteile usw...)

und opengl ist wichtig;) also darum geht es mir in jedem fall(2D/3D)


melden

Programmieren: Hilfe & Austausch

05.02.2013 um 20:50
@AnGSt

was ist, wenn zwischen zwei Zeiträumen eine Pause liegt? wird die dann aufgefüllt?

@neoschamane

Wikipedia: JNI

damit kannst du Java Bibliotheken in c/c++ nutzen und umgekehrt.


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

05.02.2013 um 20:52
@interpreter

Es soll immer das kleinste von beiden Startdatums und das größte von beiden Enddatums genommen werden, da ist nicht das Problem, da weiß ich schon, wie das geht. Eine Vorgehensweise in Pseudocode wäre was, oder noch ein paar spezielle Queries die mein Vorhaben vereinfachen. :D


melden

Programmieren: Hilfe & Austausch

05.02.2013 um 21:01
na...

als erstes sammelst du alle Einträge die auftreten zusammen. entweder in einem Array oder programmiererisch wahrscheinlich günstiger indem du immer 2 Personen auf einmal mischt.

merge(persA_ID,persB_ID){

SQL-Daten-sammeln

persA_start=minimum(persA_start,persB_start);
persA_end=maximum(persA_end,persB_end);

Arrays der Verbindungen von persA und persB verbinden dann unique verwenden.
ergibt die Verbindungen von Beiden zusammen


persA mit SQL aktualisieren

persB mit SQL löschen

}


melden

Programmieren: Hilfe & Austausch

06.02.2013 um 00:20
Zitat von AnGStAnGSt schrieb:Und nach der Zusammenführung der Personen sollen die Tabellen so aus schauen:
Felder: AuthorID, GroupID, Since (Date), Until (Date)
(t) 1 D .. ..
(z) 1 A .. ..
(x) 1 B .. ..
(u) 4 C .. ..

Dei Zeile (x) 1 B .. ..
ergibt sich aus der zusammenführung von

(y) 2 A .. ..
(x) 2 B .. ..
(w) 3 B .. ..

dabei werden die Gruppen zusammengeführt, jede Gruppe als "unique" erhalten und für jede neue Gruppe welche der "primären" User ID "noch nicht" zugeordnet war eine neue Zeile mit der neuen "unique" GroupID erstellt?
Woran identifizierst du doppelte User?

Was is mit der Zeile:
(v) 3 C .. ..??

Müsste die neue Tabelle nicht so aussehen:

Felder: AuthorID, GroupID, Since (Date), Until (Date)
(t) 1 D .. ..
(z) 1 A .. ..
(x) 1 B .. ..
(x) 1 C .. ..
(u) 4 C .. ..

Sry wenn ich zu verpeilt bin..


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

06.02.2013 um 04:07
hm

Du hast Recht, aus (v) 3 C wird (v) 1 C. Ich konnte nimmer editieren als mir das auf viel. Und Du hast statt v nochmal x geschrieben.

Doppelte User werden auf zwei Wegen identifiziert: a) über eine Whitelist: darin stehen viele Namen, deren Eindeutigkeit der Administration bekannt ist. Und b), der Administrator kann über das BackEnd frei eine Zielperson aus wählen und beliebig viele Quellpersonen. Die Quellpersonen werden nach dem Merge gelöscht. Zusammengeführt in den Personen werden z.B. deren Nicknames, falls verschieden, und eben deren Gruppenzugehörigkeiten.

tc96d64 918cfa merge

Es soll keine neue Zeile für eine noch nicht bestehenden Verknüpfung erstellt werden, sondern ihr AuthorID Feld soll auf den Zielautor umgeschrieben werden. Also aus 2 -> B wird 1 -> B und aus 3 -> C wird 1 C. Die Verknüpfungen (y) und (w) werden gelöscht.


melden

Programmieren: Hilfe & Austausch

06.02.2013 um 04:12
Hi,

sry. Mein fehler.

(y) 2 A .. .. fällt natürlich auch nicht (x) 1 B .. ......:)

Was ist jetzt eigentlich das Problem? Du suchst einen möglichst effektiven Weg zur Umsetzung mittels purem Sql?


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

06.02.2013 um 04:18
:)

Ja, genau das suche ich. Und zwar zB über die Verwendung von IN (...), z.B. SET AuthorID = DestAuthorID WHERE AuthorID in (1, 2, 3) AnD GroupID in (A, B, C). Die 1 kann man weg lassen.


melden

Programmieren: Hilfe & Austausch

06.02.2013 um 04:31
Denke nicht dass ich dir da ne besondere Hilfe sein kann. Die Problemstellung ist doch eher komplex.

Persönlich hab ich mich nie damit auseinadergesetzt, (bzw. weiß gar nicht ob ich es bisher überhaupt musste), komplexe Dinge mit singlequeries bzw. purem sql zu verarbeiten.

Würds vermutlich ähnlich halten wie in deinem "bisherigen Verfahren" nur eben die Zeit dabei berücksichtigen und bei Bedarf mit PHP nachhelfen.:)


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

06.02.2013 um 04:33
Hmnm, ja, ich bleibe auf jeden Fall dran. :)


melden

Programmieren: Hilfe & Austausch

06.02.2013 um 04:33
Logisch. Es ist ja auch dein Projekt.^^

PS: (hat mir ein paar anregende Gedanken gebracht)
http://www-i1.informatik.rwth-aachen.de/~algorithmus/


melden

Programmieren: Hilfe & Austausch

06.02.2013 um 04:41
PS:
Vll. solltest du erstmal eine Liste erstellen und den prozeduralen Ablauf festhalten der nötig ist um das Zielergebnis zu erreichen. Danach die queries nach der Liste erstellen und am Ende zusammenfügen und optimieren?


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

06.02.2013 um 04:42
@Dr.BT_

Ich lasse es sich entwickeln. Es gibt Momente da blicke ich klar durch, dann wieder nicht.


melden