PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Knifflig?! Werte von zwei Spalten in zwei Tabellen vergleichen.


Andree
29.04.2005, 12:12
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

$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";

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

Boothby
29.04.2005, 20:16
Mit 2 Queries müßt das doch gehen. Im ersten sammelst du alle Werte aus tabelle 1 und bastelst daraus ein Suchmuster.
Mit dem 2. Query startest du deine Suche.

//1. Query
$suchwerte = $DB_site->query("
SELECT begriff
FROM tabelle
");

while ($suchwert==$DB_site->fetch_array($suchwerte))
{
$_suchwert[] = $suchwert['begriff'];
}

$suchmuster = implode("%' OR text LIKE '%", $_suchwert);

//2. Query
$total = $DB_site->query("
SELECT text
FROM tabelle2
" . iif ($suchmuster, "WHERE text LIKE '%$suchmuster%'", "") .
");



Nun würde ich einfach die Ergebnisse aus dem 2. Query verknüpfen.
while ($text==$DB_site->fetch_array($total))
{
$suchtext .= $text['text'];
}
Du hättest dann irgend so was:Der Hund spielt mit der KatzeDie Maus hat Angst vor der KatzeHund, Katze und Maus sind noch sehr jung Nun kannst du über substr_count alle Vorkommen finden. Die Suchwerte hast du ja noch im Array $_suchwert.
foreach ($_suchwert as $wert)
{
$gefunden[$wert] = substr_count($suchtext, $wert);
}
$summe = sizeof ($gefunden);


Ungetestet. ;)

Andree
30.04.2005, 01:17
Danke Boothby,

ich glaube dein beschriebener Weg ist das, was ich mir vorgestellt habe. :cool:
Mein großes Problem ist immer noch manchmal die richtige Syntax für Querys zu finden.

Ich hatte schon eine andere Lösung die sehr elegant gewesen ist, mir aber dann letztendlich nicht das gewünschte Ergebniss lieferte.
Für eine Suche die leider nicht alle Vorkommen findet bietet sich auch so etwas an.
Vielleicht kann ja jemand mal diesen Codeschnippsel gebrauchen.

$suchwerte = $DB_site->query("
SELECT begriff,
COUNT(begriff) AS anzahl
FROM Tabelle1 LEFT JOIN Tabelle2
ON Tabelle2.text LIKE CONCAT('%', Tabelle1.begriff, '%')
GROUP BY begriff
");

Aber nun teste ich mal deinen Weg, der mir sehr logisch und sehr sinnvoll erscheint. Diese Funktion ist sicherlich während der Laufzeit ein Ressourcenfresser da ich mehrere 1000 Textzeilen durchsuchen möchte, dies allerdings nur einmalig. MySql selbst hat leider solche mächtigen Zählfunktionen nicht.

Liebe Grüße
PcFreak

Andree
30.04.2005, 10:52
So dann poste ich mal den Code welcher nun soweit vernüftig läuft und mir die gewünschten Ergebnisse liefert:

// 1. Query
$suchtexte = $DB_site->query("
SELECT text
FROM tabelle2
");

while ($suchtext = $DB_site->fetch_array($suchtexte))
{
$resultat_text[] = $suchtext['text'];
}

$suchtexte_result = implode(" ", $resultat_text);


// 2. Query
$suchbegriffe = $DB_site->query("
SELECT begriff
FROM tabelle1
");

while($suchbegriff = $DB_site->fetch_array($suchbegriffe))
{
$resultat_begriff[] = $suchbegriff['begriff'];
}

foreach ($resultat_begriff as $wert)
{
$gefunden[$wert] = substr_count($suchtexte_result, $wert);
}


$summe = implode(" ", $gefunden);
print_r($summe);

Die Variabel $summe liefert dann das Ergebnis: 2 3 2
Die Variabel $gefunden: Array ( [Hund] => 2 [Katze] => 3 [Maus] => 2 )

Ich habe damit einmal Smilies und Pagetext verglichen und es funktioniert.

Noch einmal vielen Dank für den Tipp hier. das war die richtige Richtung.

PcFreak