Sie befinden sich hier im Forenarchiv von phpforum.de wenn Sie direkt ins Forum möchten, klicken Sie bitte hier. Zur Startseite kommen Sie hier.

Knifflig?! Werte von zwei Spalten in zwei Tabellen vergleichen.

Ich habe zwei Tabellen mit jeweils einer Spalte in einer Datenbank.
Beide Tabellen bestehen aus 3 Zeilen.

Nun möchte ich die Werte der Spalte von Tabelle 1 auslesen und anschließend diese mit den Werten in der Spalte von Tabelle 2 vergleichen.

Anschließend möchte ich die Häufigkeit der gefundenen Übereinstimmungen in eine dritte Tabelle als String schreiben

Werte der Tabelle1
begriff
Hund
Katze
Maus

Werte der Tabelle2
text
Der Hund spielt mit der Katze
Die Maus hat Angst vor der Katze
Hund, Katze und Maus sind noch sehr jung

Meine Ergebnisse sollten demnach so lauten:
Hund = 2
Katze = 3
Maus = 2



Diese würde ich gerne in einem String haben
Also so
Hund = 2 ; Katze = 3 ; Maus = 2

Schön wäre es wenn ich auch die Summe aller Übereinstimmungen hätte
z.B. Summe = 7

Wie kann man so etwas realisieren?

Mein erster Ansatz sieht so aus

[PHP]$total = $DB_site->query("
SELECT text
FROM tabelle2
");

$count = 0;
while( $i = $DB_site->fetch_array($total) )
{
$count = $count + substr_count($i['text'], "Hund");
}

echo "Das Wort Hund kommt $count mal vor";[/PHP]

Wie beschrieben möchte ich diese Schleife allerdings erweitern.
Hund soll die variabel für alle Begriffe von der Spalte "begriff" der Tabelle1 sein (wegen der Gesamtsumme aller Übereinstimmungen)
Dann habe ich keine Ahnung wie ich schließlich noch den Einzelvergleich coden muss.
Zuletzt, angenommen ich habe diesen Einzelvergleich, alle Werte desselbigen noch als String zu definieren.

Hat vielleicht jemand einen Script für so etwas geschrieben oder kann mir sagen wie ich dabei am besten vorgehen soll.

Vielen Dank

Liebe Grüße
PcFreak

Hier gehts zum Orginal Eintrag "Knifflig?! Werte von zwei Spalten in zwei Tabellen vergleichen." im Forum

Antworten

Also ich würde dir empfehlen mit dem MySQL String-Operatoren zu arbeiten (Performance) und die zweite Tabelle mit einem Left-Join anzuhängen. Das ist aber eine ziemliche Spielerei, bist Du einen funktionierenden SQL Query gebastelt hast...


2.

Zitat:
Mik3e postete
Das ist aber eine ziemliche Spielerei, bist Du einen funktionierenden SQL Query gebastelt hast...
Hmm..
Nun bin ich verwirrt? Wie würde so ein Query in meinem Beispiel auszusehen haben?

PcFreak


3.

So schwer ist das auch wieder nicht:

Code:                   In Zwischenablage kopieren (nur IE)
1">




4.

Führe ich dieses Query aus, so bekomme ich aber leider folgendes Ergebniss

begriff anzahl
Hund 1
Katze 1
Maus 1

Mein gewünschtes Ergebniss sollte sein

begriff anzahl
Hund 2
Katze 3
Maus 2

Gruß
PcFreak


5.

Das wäre die Chance gewesen mal selbst nachzudenken - in der ON-Bedingung muss man "begriff" und "text" vertauschen:

Code:                   In Zwischenablage kopieren (nur IE)
2">




6.

Zitat:
Rana postete
Das wäre die Chance gewesen mal selbst nachzudenken
Stimmt ;)

Aber vielen Dank. Diese Abfrage funktioniert nun zu 100%.
Ich habe noch ein wenig Schwierigkeiten bei diesen LEFT JOIN und INNER JOIN Anfragen, da ich für meine simplen Tabellen meistens immer nur aus einer einen Wert eine Summe oder den Count auslese.

Danke noch einmal für diese Hilfe.

Liebe Grüße
PcFreak


7.

Mein gewünschtes Ergebniss ist also nun

begriff anzahl
Hund 2
Katze 3
Maus 2

[color="blue"]Nun kommt aber ein weiteres Problem hinzu. [/color]

Ändere die Werte der zweiten Tabelle in z.B.

Werte der Tabelle2
text
Der Hund spielt mit der [color="red"]Katze[/color]
Die Maus hat Angst vor der [color="red"]Katze [/color] denkt die [color="red"]Katze [/color]
Hund, [color="red"]Katze[/color] und Maus sind noch sehr jung

lauten die Ergebnisse aber leider immer noch:
begriff anzahl
Hund 2
[color="red"]Katze 3 [/color]
Maus 2

und nicht etwa:
begriff anzahl
Hund 2
[color="red"]Katze 4 [/color]
Maus 2

PcFreak


8.

Tja - das wirst Du nun mit reinem SQL nicht mehr hinbekommen - solche mächtigen Zählfunktionen hat MySQL nicht. Ich weiß zwar nicht, wozu man so etwas braucht, aber nun mußt Du selbst einen Loop über alle Datensätze schreiben und dann mit PHP-Stringfunktionen die Ergebnisse ermitteln.

NIcht besonders schwierig, aber zur Laufzeit durchaus ein Ressourcenfresser, je nachdem wie viele Datensätze Du hast. Im Grunde gesehen ist für diese spezielle Anforderung MySQL die falsche Datenhaltung - normale Textdateien in Verbindung mit "grep" etc. führen definitiv dann schneller zum Ziel.


9.

Die Funktion soll dazu dienen ,die Häufigkeit von geposteten Smilies auf einem Forum, ähnlich wie diesem zu ermitteln.
Die Smlies wären dann sozusagen meine Begriffe (dessen bbcode ist ja ähnlich die eines Wortes z.B. :grinz:, :bibo: ect...), die Posts selbst dann der zu durchsuchende Text.
Diese Suche sollte dann einmal täglich bzw stündlich mittels Crownjobs durchgeführt werden.

In der Theorie dachte ich mir, das einmalig eine kompletter Vergleichssuche aller Posts stattfindet und diese dann mit einen timestamp versehen wird
Dannach würde sich die erneuten Vergleiche nur noch auf Posts beziehen desen timestamp einen höheren Wert besitzt.

Die Ergebnisse der ersten und folgendenen Suche würden dann nur noch addiert.

Obwohl ich schon solche Smilie Statistiken auf eingen Foren bzw. Boards gesehen habe habe ich leider, trotz ausgibiger google Suche keine codeschnippsel o.ä. finden können.

Aber egal.
Dein Query hat mir trotzdem einen guten Weg einer DB Abfrage aufgezeigt und ich habe eine Menge dabei gelernt. ;)

Liebe Grüße
PcFreak


10.

>Obwohl ich schon solche Smilie Statistiken auf eingen Foren bzw. Boards gesehen habe habe ich leider, trotz ausgibiger google Suche keine codeschnippsel o.ä. finden können.


Dann wird sich das furchtbarste vom allerfurchtbarsten ggf. nur noch schlecht umgehen lassen: selbst programmieren :-((


11.

Zitat:
Rana postete
Dann wird sich das furchtbarste vom allerfurchtbarsten ggf. nur noch schlecht umgehen lassen: selbst programmieren :-((
OK.
Dann mal hier mein code den ich so weit ferig habe (selbst programmiert ;))

Tabelle2 ist meine post Tabelle
Tabelle1 meine Smilietabelle

Code:                   In Zwischenablage kopieren (nur IE)
3">

Die Variabel Summe gibt mir nun die Werte richtig aus.
Ungefähr so: 51 4 33 33 11 ... usw
Die Variable $gefunden gibt mir die Werte wie folgt aus:
Code:                   In Zwischenablage kopieren (nur IE)
4">

Nun gibt es zu den Smilies ein zugehörige ID. das smile :cool: als 5 Smilie in meinem Array hat die ID 5. Die smilies sind also nach ID sotiert.

Nun ein Knackpunkt, weil ich noch nicht so gut mit mancher Syntax von php vertraut bin.
Zum einen würde ich die ID mit in meinem $summe Array mit ausgeben.
Dieses Array sollte so aussehen: 1=51;2=4;3=33;4=33,5=11
Hinterher könnte ich mit explode diesen String auseinander nehmen und dann damit weiterarbeiten.

Zweitens würde ich dieses Array gerne aufsteigend sotieren
Vielleicht hat jemand ein kleinen Tipp für mich wie ich das Array entsprechend erweitern könnte?

Die Routine ist übrigens recht flott und benötigt bei ca 100 Posts nur Millisekunden.


12.

>Die Routine ist übrigens recht flott und benötigt bei ca 100 Posts nur Millisekunden.

Dann warten wir mal ab, bis Du 10.000 oder 100.000 Posts hast - da trennt sich die Spreu vom Weizen...

Zu dem Problem mit dem Smily-Array: mit array_flip kannst Du ein Array "umdrehen" - die Werte werden die keys und die keys werden die Werte - das sollte Dir weiterhelfen.


13.

Zitat:
Dieses Array sollte so aussehen: 1=51;2=4;3=33;4=33,5=11
Hinterher könnte ich mit explode diesen String auseinander nehmen und dann damit weiterarbeiten.

Geile Aussage...

Ich empfehle dir die Werte bereits in einem Array zu speichern dann wird das explode überflüssig ;)


14.

Zitat:
Foggy postete
Ich empfehle dir die Werte bereits in einem Array zu speichern dann wird das explode überflüssig ;)
Das explode brauche ich später, da ich den String ja wieder zerlegen und den Nummern die ID zu ordnen möchte.
(Brauche ich dann für eine grafische Auswertung ;)
Der komplette String soll in nur einer Spalte und Zeile geschrieben werden.

@Rana
Die array_flip funktion kannte ich noch nicht. Danke für den Tipp. Das probiere ich mal aus.
Naja bei hunderttausend Posts wird es wohl kritscher mit der Geschwindigkeit.
Aber wie ich schon sagte. Dieser Script wird nur einmal durchgeführt und diese Daten gespeichert. Danach nur noch auf die Post s(welche einen timestamp in der db besitzen) dessen Stamp höher als mein angelgter ist.
Meiner eigener wird dann nach jede Überprüfung auf aktuelle Zeit gebracht.
Die alten mit den neuen Werte addiert. (So in etwa stelle ich mir das vor)

Selbst bei sehr großen Foren wären es, würde ich dies stündlich machen, niemals mehr als 100 Beiträge welche verglichen werden müssten.
Nochmals danke für eure Unterstützung

Gruß
PcFreak


Hier gehts zum Orginal Eintrag "Knifflig?! Werte von zwei Spalten in zwei Tabellen vergleichen." im Forum
 
phpforum.de | Impressum