Anzeige:
Ergebnis 1 bis 8 von 8

Thema: [MySQL] Doppelte Ausgabe eines Datensatzes

  1. #1
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255

    [MySQL] Doppelte Ausgabe eines Datensatzes

    Ich habe ein seltsames verhalten bei einer Abfrage.
    Ich habe eine Datenbank mit etwa 300 Einträgen.
    Wenn ich über die ID "gebID" zu den einzelnen Bereichen eine Abfrage mache kommt bei allen immer das richtige heraus. Bis auf diesen einen Datensatz in einem Bereich. Dabei finde ich keinen Fehler. Kann da mal einer drüber sehen.
    Im Moment Löse ich das Problem mit einem Puffer Array $reg
    Code:
    CREATE TABLE `Boulder_Daten` (
      `ID` smallint(4) unsigned NOT NULL auto_increment,
      `bildID` tinyint(2) unsigned NOT NULL default '0',
      `uiaa` set('0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23') NOT NULL default '0',
      `franz` set('0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23') NOT NULL default '0',
      `fb_bloc` set('0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23') NOT NULL default '0',
      `fb_trav` set('0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23') NOT NULL default '0',
      `Farben` set('0','1','2','3','4') NOT NULL default '0',
      `Grad` set('0','1','2','3','4') NOT NULL default '0',
      `Type` set('0','1','2','3','4','5') NOT NULL default '0',
      `gebID` tinyint(3) NOT NULL default '0',
      `Name` varchar(100) NOT NULL default '',
      `desc` mediumtext NOT NULL,
      `Zustieg` mediumtext NOT NULL,
      `datum` timestamp NOT NULL default '0000-00-00 00:00:00',
      PRIMARY KEY  (`ID`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    
    INSERT INTO `Boulder_Daten` VALUES (119, 0, '0', '0', '2', '0', '0', '0', '4', 21, 'Wurzelbürste', 'Gerade hoch über Leisten zum horizontalen Band. Abstieg nach links über gestufte Rinne.Mit Sitzsstart von links etwas schwieriger.', 'An der kleinen Mauer rechterhand am Weg zum Schiffsbug ("Reeling") ganz links.', '2005-11-30 10:16:39');
    PHP-Code:
    <?php
    /**
    * @short Komplette Ausgabe eines Gebietes
    * @param [Object]  \b $x DomDocument
    * @param [Object]  \b $e DomElement
    * @param [Integer] \b $i gebID
    * @code
    <bouldersektoren>
       <!-- Bild = SortID -->
       <boulderitem id="" bild="">
          <id />
          <bildid />
          <Grad />
          <Type />
          <Name />
          <Beschreibung />
          <Zustieg />
          <timestamp />
          <UIAA />
          <Franz />
          <Bloc />
          <Trav />
       </boulderitem>
    </bouldersektoren>
    * @endcode
    * @return \e Array \b [Void] \e DomNode
    */
    function BoulderSektorenDatenDomDocument $xDomElement $e$i )
    {
       
    $PRF SQLPREFIX;
       
    $q mysql_query"SELECT SQL_BIG_RESULT DISTINCTROW
          a.Name COLLATE utf8_general_ci AS `Name`
          , a.ID AS `id`, a.bildID AS `bildid`
          , MAKE_SET( a.Farben, 'Gelb', 'Blau', 'Rot', 'Weiss' ) AS `select-farbe`
          , a.desc COLLATE utf8_general_ci AS `Beschreibung`
          , a.Zustieg COLLATE utf8_general_ci AS `Zustieg`
          , a.Grad AS `Definition`, a.Type AS `Type`
          , UNIX_TIMESTAMP( a.datum ) AS `timestamp`
          , b.uiaa AS `UIAA`, c.franz AS `Franz`
          , d.fb_bloc AS `Bloc`, e.fb_trav AS `Trav`
          , f.name COLLATE utf8_general_ci AS `gebiet`, g.ID AS `fit`
          FROM `
    ${PRF}Boulder_Daten` AS a
          LEFT JOIN `
    ${PRF}Boulder_Bewertung` AS b ON FIND_IN_SET( a.uiaa, b.ID )
          LEFT JOIN `
    ${PRF}Boulder_Bewertung` AS c ON FIND_IN_SET( a.franz, c.ID )
          LEFT JOIN `
    ${PRF}Boulder_Bewertung` AS d ON FIND_IN_SET( a.fb_bloc, d.ID )
          LEFT JOIN `
    ${PRF}Boulder_Bewertung` AS e ON FIND_IN_SET( a.fb_trav, e.ID )
          LEFT JOIN `
    ${PRF}Boulder_Gebiete` AS f ON f.ID='" . (int)$i "'
          LEFT JOIN `
    ${PRF}Boulder_Kommentare` AS g ON g.boulID=a.ID
          WHERE ( a.gebID LIKE '" 
    . (int)$i "' )
          ORDER BY a.ID,a.bildID ASC LIMIT 0,300 LOCK IN SHARE MODE;
          "
    $GLOBALS['CON']
       );

       if ( 
    defined'HJCMS_DEBUGGER' ) && HJCMS_DEBUGGER == && isset( $_SESSION['SQL_QUERY_COUNT'] ) )
          (int)
    $_SESSION['SQL_QUERY_COUNT']++;

       
    $HideDomNode = array( 'bildid''gebiet''fit' );

       if ( 
    $q ) {
          
    $bs $x->createElement'bouldersektoren' );
          
    $e->appendChild$bs );
          
    $reg = array(); // Doppelte Ausgabe Verhindern!
          
    while( $r mysql_fetch_assoc$q ) ) {
             if ( ! 
    in_array( (int)$r['id'], $reg ) ) {
                
    array_push$reg, (int)$r['id'] );

                
    $s $x->createElement'boulderitem' );
                
    $s->setAttribute'gebID', (int)$i );
                
    $s->setAttribute'id'$r['id'] );
                
    $s->setAttribute'bild'$r['bildid'] );
                
    $s->setAttribute'gebiet'StripToUtf8$r['gebiet'] ) );

                foreach ( 
    $r AS $k => $v )
                {
                   if ( ! empty( 
    $v ) && $k != 'id' && ! in_array$k$HideDomNode ) ) {
                      
    $ele $x->createElement$kStripToUtf8$v ) );
                      
    $s->appendChild$ele );
                   }
                }

                
    // Ajax Dataset vorbereiten
                
    if ( ! empty( $r['fit'] ) && defined'HJCMS' ) ) {
                   
    $ele $x->createElement'comSet' );
                   
    $ele->setAttribute'rouID', (int)$r['id'] );
                   
    $ele->setAttribute'start'$r['fit'] );
                   
    $ele->setAttribute'limit'999 );
                   
    $json = array( (int)$r['id'], (int)$r['fit'], 999HJCMS );
                   
    $ele->setAttribute'json'json_encode$json ) );
                   
    $s->appendChild$ele );
                   unset( 
    $json );
                }
                
    $bs->appendChild$s );
             }
          }
          
    mysql_free_result$q );
       }
       unset( 
    $reg );

       
    // XMLDebug( $x );

       
    if ( isset( $x ) && is_object$x ) ) {
          
    $xsl = new TemplateParser;
          return 
    $xsl->GetInnerHtmlExternXMLDomObject'Ausgabe_Boulder_Sektor'$x );
       }
       return 
    true;
    }
    ?>
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.06.2004
    Beiträge
    101
    Was sagt mysql_num_rows vor der while(mysql_fetch_assoc)?

    btw: if($q) find ich persönlich schlecht. Ich lös es immer so: if(mysql_num_rows($q) > 0) ....

  3. #3
    Registrierter Benutzer Avatar von Romanday
    Registriert seit
    03.02.2004
    Beiträge
    829
    Zitat Zitat von undefined
    Ich habe ein seltsames verhalten bei einer Abfrage.
    Ich habe eine Datenbank mit etwa 300 Einträgen.
    Wenn ich über die ID "gebID" zu den einzelnen Bereichen eine Abfrage mache kommt bei allen immer das richtige heraus. Bis auf diesen einen Datensatz in einem Bereich. Dabei finde ich keinen Fehler.
    Was passiert den wenn du über bildID joinst?
    Bei `gebID` tinyint(3) gibt es da nicht redundante Tupel?
    Geändert von Romanday (05-06-2006 um 09:48 Uhr)
    Abriss, bzw. die Sprengung des World Trade Centers
    WDR Dokumentation
    Doku + DT Untertitel
    Weitere Infos - Terrorstorm

  4. #4
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Zitat Zitat von Romanday
    Was passiert den wenn du über bildID joinst?
    Bei `gebID` tinyint(3) gibt es da nicht redundante Tupel?
    Ich habe den Fehler gefunden tiniyint ist OK daran lag es nicht den könnte ich sogar auf 2 setzen weil ich hier die 30 nicht übersteige.

    Problem liegt bei FIND_IN_SET das frist immens Speicher Wenn der Letzte JOIN 0 zurückgibt.
    Lösung: sort_buffer_size angehoben jetzt stimmts und ich muß nur eine Abfrage für ca. 250 Datensätze machen. Von der last ist das kein Problem 4CPU's 1,5 GB Speicher

    @Beatkiller
    Was du macht finde ich sogar noch schlechter weil du mit mysql_num_rows noch mal extra einen stack aufmachst den ich hier gar nicht brauche.
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  5. #5
    Registrierter Benutzer Avatar von Romanday
    Registriert seit
    03.02.2004
    Beiträge
    829
    Zitat Zitat von undefined
    Problem liegt bei FIND_IN_SET das frist immens Speicher Wenn der Letzte JOIN 0 zurückgibt.
    Lösung: sort_buffer_size angehoben jetzt stimmts und ich muß nur eine Abfrage für ca. 250 Datensätze machen. Von der last ist das kein Problem 4CPU's 1,5 GB Speicher
    .
    Du solltest die Db noch 1x anders normalisieren.

    Kettenjoins verkleinern. Laß dir mal
    die Rechenarbeit bei der Abfrage anzeigen und
    dann rechne hoch...

    Was passiert bei 2500 oder 250 000 Tupels?

    Vorher notieren welche Abfragen unbedingt notwendig sind.
    Vielleicht bestimmte Attribute zusammenlegen und dann den
    Parser arbeiten lassen. Vorher die Geschwindigkeit mit
    verschiedenen Abfragen testen, sonst bist du nachher nur noch
    am rumfummeln und umbauen.
    Abriss, bzw. die Sprengung des World Trade Centers
    WDR Dokumentation
    Doku + DT Untertitel
    Weitere Infos - Terrorstorm

  6. #6
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Ist schon längst passiert, die DB war einfach zu schwach eingestellt. Das habe ich selbst gemacht aus Performance gründen - damit findet man schneller fehler findet ( Eigentor ). Diese Abfrage ist bei weitem nicht so hungrig wie sie Aussieht. Und die joins gehen in Ordnung weil sie nur Maximal 30 Index Sätze ziehen.
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  7. #7
    Registrierter Benutzer Avatar von Romanday
    Registriert seit
    03.02.2004
    Beiträge
    829
    Zitat Zitat von undefined
    Ist schon längst passiert, die DB war einfach zu schwach eingestellt. Das habe ich selbst gemacht aus Performance gründen - damit findet man schneller fehler findet ( Eigentor ). Diese Abfrage ist bei weitem nicht so hungrig wie sie Aussieht. Und die joins gehen in Ordnung weil sie nur Maximal 30 Index Sätze ziehen.
    Wunderte mich nur, dass sich die Ergebnisse deiner Abfrage sich in
    Abhängigkeit vom Speicher ändern + die Default Einstellungen bei
    300 Tupels nicht ausreichen.
    Abriss, bzw. die Sprengung des World Trade Centers
    WDR Dokumentation
    Doku + DT Untertitel
    Weitere Infos - Terrorstorm

  8. #8
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Du hast nicht richtig gelesen, ich habe die Datenbank selbst Runtergeschraubt. Weil es sich um eine Test System handelt.
    Zudem geht es hier nicht um Tupels.
    MySQL erzeugt pro Abgrage mehrer INDEXES die mit sort_buffer_size gepuffert werden.
    Im Normalfall liegt der wert bei 200k ich hatte ihn auf 60k.
    Wenn du z.B. keine ORDER BY Klausel verwendest geht dieser WERT Automatisch hoch.
    Jedes Query das eine Sortieranfrage durchfuehrt muss alloziert werden.
    Und genau das macht FIND_IN_SET
    Geändert von undefined (05-06-2006 um 19:15 Uhr)
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •