Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Doppelte Datensätze anzeigen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Goreo
    hat ein Thema erstellt [Erledigt] Doppelte Datensätze anzeigen.

    [Erledigt] Doppelte Datensätze anzeigen

    Hallo allerseits,

    ich habe ein Problem mit meinem Deutsch Griechisch Lexikon. Und zwar möchte ich alle Datensätze aus der Datenbank auslesen und dann mit html_entity_decode und strcmp kontrollieren, ob es Datensätze gibt, die doppelt vorkommen. Problem ist nämlich, dass einige Daten mit einem anderen charset gespeichert wurden.

    Folgenden Ansatz habe ich bereits. Allerdings ist es mir schleierhaft wie man jeden einzelnen Eintrag mit den anderen verlgeichen muss.

    PHP-Code:
    $ask"SELECT griechisch FROM word WHERE griechisch LIKE '%&#x%'";
    $remysql_query($ask) or die('Abfrage fehlgeschlagen'mysql_error());
    while (
    $datensatzmysql_fetch_array($re)) {
    $test html_entity_decode($datensatz["griechisch"]);
    $ask2"SELECT griechisch FROM word WHERE griechisch LIKE '%&#9%'";
    $re2mysql_query($ask) or die('Abfrage fehlgeschlagen'mysql_error());
    while (
    $datensatz2mysql_fetch_array($re2)) {
    $vergleich strcmp($datensatz["griechisch"], $datensatz2["griechisch"]); 
    PS: Das Griechisch LIKE soll bezwecken, dass er nach der bestimmten Kodierung sucht. Also alle Einträge mit der einen Kodierung beinhalten %#x und die anderen &#9. Nun sollen alle ausgewählt und miteinander verglichen werden. Gibt es Übereinstimmungen sollen diese angezeigt werden.


    Kann mir jemand behilflich sein?

    Dank im Vorraus,

    Goreo

  • Gast-Avatar
    Ein Gast antwortete
    @Manko10: Das ist das ganze Script.

    Ich glaub, ich werde erstmal das Script einfach eine Stunde lang versuchen mit dem Browser zu öffnen, vielleicht passiert ja irgendwas...

    Das mit dem Array hab ich nicht ganz verstanden, mein Tabelleninhalt wird doch auch in ein Array geladen? In $datensatz.

    Einen Kommentar schreiben:


  • cycap
    antwortet
    Also ich hatte sowas ähnliches und hab mir dann einfach den Tabelleninhalt in ein Array geladen. Das geht schneller, braucht aber bei vielen Datensätzen auch viel Ram und PHP hat mir dann irgendwann gesagt das ich meine allowed memory size überschritten habe, hab die dann einfach in der php.ini höher gesetzt xD

    Einen Kommentar schreiben:


  • Manko10
    antwortet
    Kann, ja. Sollte natürlich nicht. Komisch, dass das Skript noch nicht abgebrochen wurde.
    JOINs sind nicht unbedingt schnell, aber oft die einzige Möglichkeit. Wenn du dazu noch Schleifen in PHP verwendest, kann so eine Skriptlaufzeit durchaus zustande kommen.
    Ich kenne ja auch nicht dein ganzes Skript und ebenso wenig den Aufbau deiner Datenbank.

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Der lädt die Seite jetzt schon seit ca. 15 Minuten...

    Kann das solange dauern bei 16000 Datensätzen?

    Einen Kommentar schreiben:


  • Manko10
    antwortet
    Tatsächlich, habe ich doch einen wesentlichen Bestandteil vergessen...

    1.) ON-Klausel fehlte (Asche über mein Haupt - das kommt davon, wenn man das aus dem Kopf schreibt)
    2.) MySQL unterstützt doch gar kein OUTER JOIN. Ein INNER JOIN sollte es aber letztendlich auch tun.

    Code:
    SELECT a.griechisch AS griechisch_1, a.deutsch AS deutsch_1, b.griechisch AS griechisch_2, b.deutsch AS deutsch_2
    FROM word a
    INNER JOIN word b
    ON a.griechisch = b.griechisch
    WHERE a.griechisch LIKE '%&#x%' OR b.griechisch LIKE '%&#9%';
    An sich würde auch es auch ein impliziter JOIN tun:
    Code:
    SELECT a.griechisch AS griechisch_1, a.deutsch AS deutsch_1, b.griechisch AS griechisch_2, b.deutsch AS deutsch_2
    FROM word a, word b
    WHERE a.griechisch LIKE '%&#x%' OR b.griechisch LIKE '%&#9%' AND a.griechisch = b.griechisch;

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Danke Manko10,

    aber ich kriege die Fehlermeldung Abfrage fehlgeschlagenYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FULL OUTER JOIN word b WHERE a.griechisch LIKE '%�%' OR b.griechisch LIKE '%�'

    Einen Kommentar schreiben:


  • Manko10
    antwortet
    Habe mir mal die Mühe gemacht, den Code lesbar zu formatieren, damit Leute, die nach mir kommen, schneller sehen, was los ist.
    PHP-Code:
    $ask"SELECT griechisch, deutsch FROM word WHERE griechisch LIKE '%&#x%'";
    $remysql_query($ask) or die('Abfrage fehlgeschlagen'mysql_error());

    while (
    $datensatzmysql_fetch_array($re)) {
        
    $test html_entity_decode($datensatz["griechisch"]);
        
    $ask2"SELECT griechisch, deutsch FROM word WHERE griechisch LIKE '%&#9%'";
        
    $re2mysql_query($ask) or die('Abfrage fehlgeschlagen'mysql_error());
        while (
    $datensatz2mysql_fetch_array($re2)) {
            
    $test2 html_entity_decode($datensatz2["griechisch"]);
            
            if (
    $test == $test2) {
                echo 
    " | ".$test2."";
            }
        }

    Also dass du eine Execution Time Error bekommst, liegt daran, dass du viele Einträge hast und jeden einzeln aufwändig bearbeitest. Du hast ja sogar noch einen SQL-Query innerhalb der Schleife.
    Das alles hat zu Folge, dass das Skript sehr lange braucht und dann nach 30 Sekunden abbricht.

    Vielleicht hilft dir ein JOIN, das ganze schneller zu gestalten. Etwa wie der:
    Code:
    SELECT a.griechisch AS griechisch_1, a.deutsch AS deutsch_1, b.griechisch AS griechisch_2, b.deutsch AS deutsch_2
    FROM word a
    FULL OUTER JOIN word b
    WHERE a.griechisch LIKE '%&#x%' OR b.griechisch LIKE '%&#9%';

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Ups, das hatte ich falsch hierhineinkopiert, sorry.
    Also, das steht in der Datei ohne zweite Klammer da. Und dann bekomm ich halt die Maximum execution time of 30 seconds exceeded.

    Beziehungsweise er fängt an, mir die ersten ca. 500 Datensätze anzuzeigen und dann bricht er ab wegen Maximum execution time of 30 seconds exceeded. Aber die Datensätze, die er ausgibt, sind auch nicht richtig, also er gibt nicht die doppelten Datensätze aus, sondern einfach die ersten 500.

    Einen Kommentar schreiben:


  • cycap
    antwortet
    Also so wie du den Code gepostet hast müsstest du eigentlich einen Parse Error bekommen, siehe doppelte Klammer am ende vom if

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Fehler

    Mit folgendem Code
    PHP-Code:
    $ask"SELECT griechisch, deutsch FROM word WHERE griechisch LIKE '%&#x%'";
    $remysql_query($ask) or die('Abfrage fehlgeschlagen'mysql_error());
    while (
    $datensatzmysql_fetch_array($re)) {
    $test html_entity_decode($datensatz["griechisch"]);
    $ask2"SELECT griechisch, deutsch FROM word WHERE griechisch LIKE '%&#9%'";
    $re2mysql_query($ask) or die('Abfrage fehlgeschlagen'mysql_error());
    while (
    $datensatz2mysql_fetch_array($re2)) {
    $test2 html_entity_decode($datensatz2["griechisch"]);

    if(
    $test == $test2)) { echo " | ".$test2.""; }}} 
    bekomm ich ein Maximum execution time of 30 seconds exceeded


    Was mache ich falsch?

    Einen Kommentar schreiben:


  • cycap
    antwortet
    Du kannst zwei Arrays auch einfach mit if($arr1 == $arr2) vergleichen, strcmp() ist ja für einen Stringvergleich wie der Name schon sagt.... (string compare)

    Einen Kommentar schreiben:

Lädt...
X