php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 03.09.2004, 02:19  
Erfahrener Benutzer
 
Registriert seit: 30.06.2004
Beiträge: 619
tapferesschneiderlein
Standard Zeile einfach überspringen bei Unique-Verletzung

Code:
## Diese Tabelle existiert schon und ist gefüllt
## (»id« ist hier nicht der Primary Key):

CREATE TABLE be_backup (
  backup_id int(10) unsigned NOT NULL auto_increment,
  aend timestamp(14) NOT NULL,
  login tinyint(3) unsigned default '0',
  id int(11) unsigned NOT NULL default '0',
  ma tinyint(4) default NULL,
  a_ue tinyint(3) unsigned default NULL,
  email varchar(150) default NULL,
  PRIMARY KEY  (backup_id),
  KEY id (id)
) TYPE=MyISAM;


## Jetzt möchte ich eine Tabelle, die folgende Form hat:

CREATE TABLE ma_link 
  (
  id SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  be_id SMALLINT(5) UNSIGNED,
  ma_id TINYINT(3) UNSIGNED,
  beginn DATE,
  PRIMARY KEY (id)
  );

## Das klappt auch.

## In der Zieltabelle darf es für jeden Wert »be_id« nur 
## verschiedene Werte »beginn« geben. Deshalb setze ich 
## einen Unique-Index auf die beiden Felder:

ALTER TABLE ma_link ADD UNIQUE be_date_unique (be_id, beginn);


## Mit folgendem Statement versuche ich nun, das jeweils älteste 
## Änderungsdatum pro »id« (ja, es gibt mehrere Einträge) und »ma«
## in die Zieltabelle zu bekommen.

INSERT INTO ma_link (be_id, ma_id, beginn) 
    SELECT id, ma, min(aend) AS d
    FROM be_backup
    WHERE ma IS NOT NULL 
        AND ma != 0
    GROUP BY id, ma
    ORDER BY d DESC;

## Ohne vorher gesetzten Unique-Index klappt das auch -- mit ihm kommt
## immer dann eine Fehlermeldung, wenn erstmals ein doppelter 
## Eintrag auftaucht (dafür ist der Unique-Index ja auch gedacht), 
## allerdings bricht dann auch der ganze Befehl ab.

## Wie überrede ich MySQL dazu weiterzumachen bzw. hat jemand eine
## bessere Idee für das Problem?
tapferesschneiderlein ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 03.09.2004, 03:47  
Gast
 
Beiträge: n/a
Standard

Gut möglich, dass ich das Problem nicht verstanden habe, aber warum gruppierst Du überhaupt nach ma?
  Mit Zitat antworten
Alt 03.09.2004, 09:29  
Erfahrener Benutzer
 
Registriert seit: 30.06.2004
Beiträge: 619
tapferesschneiderlein
Standard

Beispieldaten:
Code:
INSERT INTO be_backup VALUES("1091", "20030919083527", "2", "910", "3", NULL, "");
INSERT INTO be_backup VALUES("1092", "20030919083706", "2", "910", "3", NULL, "");
INSERT INTO be_backup VALUES("1564", "20031027145259", "3", "910", NULL, NULL, NULL);
INSERT INTO be_backup VALUES("1617", "20031103134853", "3", "910", "3", NULL, "");
INSERT INTO be_backup VALUES("8411", "20040628145556", "7", "910", "3", "0", "");
INSERT INTO be_backup VALUES("1095", "20030919090320", "6", "911", "6", NULL, "");
INSERT INTO be_backup VALUES("1097", "20030919091446", "6", "912", "6", NULL, "xxx");
INSERT INTO be_backup VALUES("1098", "20030919091540", "6", "912", "6", NULL, "xxx");
INSERT INTO be_backup VALUES("1099", "20030919091718", "6", "912", "6", NULL, "xxx");
INSERT INTO be_backup VALUES("1674", "20031106092920", "7", "912", "4", NULL, "xxx");
INSERT INTO be_backup VALUES("1675", "20031106093148", "7", "912", "2", NULL, "xxx");
INSERT INTO be_backup VALUES("1101", "20030919095008", "2", "913", "2", NULL, "");
INSERT INTO be_backup VALUES("1303", "20031002095644", "2", "913", "2", NULL, "");
INSERT INTO be_backup VALUES("1304", "20031002095711", "2", "913", NULL, NULL, NULL);
INSERT INTO be_backup VALUES("5195", "20040325151439", "2", "913", "2", "0", "");
INSERT INTO be_backup VALUES("6168", "20040429100055", "7", "913", "2", "0", "");
INSERT INTO be_backup VALUES("10811", "20040812102840", "10", "913", "2", "0", "");
INSERT INTO be_backup VALUES("1105", "20030919115259", "2", "915", "2", NULL, "");
INSERT INTO be_backup VALUES("1106", "20030919125956", "2", "915", NULL, NULL, NULL);
INSERT INTO be_backup VALUES("11396", "20040826161432", "3", "915", "2", "0", "");
Wenn ich nur nach id gruppiere, bekomme ich jede id nur einmal. Ich brauche aber das jeweils älteste Änderungsdatum pro id und ma, hier am Beispiel der id 912 zu sehen, die drei verschiedene ma mit jeweils ältestem aend hat.
tapferesschneiderlein ist offline   Mit Zitat antworten
Alt 03.09.2004, 12:10  
Gast
 
Beiträge: n/a
Standard

Aber durch Deine Beschränkung UNIQUE be_date_unique (be_id, beginn) kannst Du doch eh' nur einen davon eintragen. Gibt es eine Regel, welchen Eintrag Du bei Konflikten haben willst?
  Mit Zitat antworten
Alt 03.09.2004, 13:01  
Erfahrener Benutzer
 
Registriert seit: 30.06.2004
Beiträge: 619
tapferesschneiderlein
Standard

Code:
INSERT INTO ma_link (be_id, ma_id, beginn) 
    SELECT id, ma, min(aend) AS d 
    FROM be_backup 
    WHERE ma IS NOT NULL 
        AND ma != 0 
    GROUP BY id, ma 
    ORDER BY d DESC;
ORDER BY d DESC => den neusten.
tapferesschneiderlein ist offline   Mit Zitat antworten
Alt 03.09.2004, 13:17  
Erfahrener Benutzer
 
Registriert seit: 30.06.2004
Beiträge: 619
tapferesschneiderlein
Standard

Habe gerade gesehen, daß sich durch das Schwärzen der email-Adressen einige aend-Felder aktualisiert hatten (wodurch vielleicht nicht mehr deutlich wird, wo das Problem ist), so daß ich die Beispieldaten oben nochmal korrigiere ...
tapferesschneiderlein ist offline   Mit Zitat antworten
Alt 03.09.2004, 14:29  
Gast
 
Beiträge: n/a
Standard

ah, ein bisschen besser verstehe ich das Problem jetzt schon - aber richtig durchdrungen habe ich es noch nicht.
Du brauchst anscheinend die exakte Zeile mit dem gruppenweisen Maximum; nicht nur das Maxium selbst und irgendeine sonstige Zeile aus der Gruppe, wie Du es mit Deiner Abfrage erhälst.
Schau Dir mal http://dev.mysql.com/doc/mysql/en/ex...group-row.html an.
Vielleicht ist
Code:
SELECT a.id, a.ma, a.aend
FROM be_backup as a 
LEFT JOIN be_backup as b
ON a.id=b.id AND a.ma=b.ma AND a.aend<b.aend
WHERE
NOT ISNULL(a.ma)
AND a.ma != 0
AND ISNULL(b.aend)
ORDER BY a.aend DESC
eine Lösung, aber ich bin im Moment echt zu fahrig, um mich richtig damit auseinander zu setzen. Sorry, ich schreib's mir mal auf die Liste am Monitor
  Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] 'upload-Datei' Zeile für Zeile auslesen Felix PHP Tipps 2008 18 29.06.2008 02:55
SWiki, weil einfach einfach einfach ist. b++ Beitragsarchiv 0 06.10.2007 19:07
Zeile einfügen tennessee Server, Hosting und Workstations 5 02.06.2006 21:05
2 verschachtelte while Schleifen. Großes Performanceproblem Datenbanken 3 30.05.2005 12:52
durchlauf,zeile für zeile + update Skazi Datenbanken 10 25.11.2004 13:59
[Erledigt] Funktion MAIL() funkt nicht PHP Tipps 2004 16 11.07.2004 17:25

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
http://www.php.de/datenbanken/8245-zeile-einfach-ueberspringen-bei-unique-verletzung.html, sql insert doppelte überspringen, insert into spalte auslassen, sql einfügen doppelter datensätze überspringen, insert into unique, mysql unique überspringen, insert into primary key überspringen, insert into mysql überspringen wenn schon vorhanden, sql order by zeilen auslassen, insert into fehler unique, php mysql row überspringen, php html code überspringen, mysql doppelten eintrag beim auslesen überspringen, sql script um unique zeile die doppelt ist zu löschen, primärschlüssel doppelte überspringen, mysql order by werte auslassen, insert doppelte überspringen, mysql unique key verletzt, mysql insert 1. zeile überspringen, mysql falls unique überspringen

Alle Zeitangaben in WEZ +2. Es ist jetzt 13:11 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.