PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SQL... (MYSQL)


blax
2006-06-29, 17:43:51
Hi,

folgendes Problem, folgende Tabelle:

ID | WERT | STATUS
-------------------------
3 | 8 | 1
3 | 8 | 0
4 | 5 | 1
4 | 5 | 1
5 | 1 | 1
6 | 9 | 1


Aus dieser Tabelle würde ich gerne Zeilen mit gleichen ID's gruppieren und doppelte, bei denen einer der beiden STATUS's 0 ist, löschen
Also wäre das gewünschte Ergebnis:


ID | WERT | STATUS
-------------------------
4 | 5 | 1
5 | 1 | 1
6 | 9 | 1



bitte um Hilfe :|

edit: Tabelle schöner ausgerichtet

Xanatos
2006-06-29, 18:18:11
Naja, du kannst doch einfach den Wert von Status auslesen und wenn er Null ist löschen?

Coda
2006-06-29, 18:20:04
Sowas in die Richtung (ungetestet)

"SELECT id, distinct(wert), status FROM table WHERE status=1"

blax
2006-06-29, 18:23:47
hmm...ja ich könnte


DELETE FROM t1 WHERE id=(SELECT id FROM t1 WHERE status=0)


aber, das Problem ist, dass die Tabelle t1 aus einem select entstanden ist (genauer gesagt durch ein UNION). Also aus 2 Tabellen die den selben Aufbau haben wie t1, deshalb kommt es auch zu stande, dass IDS öfter vorkommen.

Ich müsste eine temporäre Tabelle dafür erstellen, geht das mit MYSQL?

blax
2006-06-29, 18:25:58
Coda[/POST]']Sowas in die Richtung (ungetestet)

"SELECT id, distinct(wert), status FROM table WHERE status=1"

meines Wissens nach kann man distinct nicht auf einzelne Spalten anwenden, sondern nur auf alle.. :(

darph
2006-06-29, 19:20:19
blax[/POST]']Ich müsste eine temporäre Tabelle dafür erstellen, geht das mit MYSQL?
Ja. mit Create View und nach dem Statement nochmal Drop View

blax
2006-06-29, 19:28:07
..jo
aber ich weiß noch immer wie ich mir das so aufbereite, wie ich will. Weil Folgendes geht nicht:


DELETE FROM t1 WHERE id=(SELECT id FROM t1 WHERE status=0)

Godmode
2006-06-29, 19:45:20
Wenn t1 ein Union aus 2 Tabellen ist, dann würde ich aus t1 eine View machen und für diese View dann einen Delete Trigger definieren. Ich weiß aber nicht ob das in MYSQL geht kenn es nur von Oracle her.

registrierter Gast
2006-06-29, 21:35:40
blax[/POST]']..jo
aber ich weiß noch immer wie ich mir das so aufbereite, wie ich will. Weil Folgendes geht nicht:


DELETE FROM t1 WHERE id=(SELECT id FROM t1 WHERE status=0)
Das ginge so auch nur mit einem IN statt eines '=', weil das SELECT eine Menge zurückgibt und keinen fixen Parameter zum vergleichen.
also:
DELETE FROM t1 WHERE id IN (SELECT id FROM t1 WHERE status=0)


Falls das nicht klappen sollte, nimmste das :smile:
DELETE t1 FROM t1
INNER JOIN (
SELECT id FROM t1
WHERE status = 0
) dt
WHERE t1.id=dt.id

blax
2006-06-30, 11:42:19
sehr genial, danke :)

Gast
2006-06-30, 12:18:08
blax[/POST]']sehr genial, danke :)welche Mglk. hat denn nun geklappt, hat das IN gereicht?
Weil wenn könnt ich auch eine meiner delete-methoden anpassen. :biggrin:

blax
2006-06-30, 13:53:19
wenn ich ganz ehrlich bin..hab ich das jetz nur mit einem select gemacht:


SELECT id, MIN(wert), status FROM t1
GROUP BY id
HAVING status>0


somit hab ich auch immer die zeile mit dem geringsten status, auch wenns mehr als 2 gleiche ID's gibt. (Bin draufgekommen, dass ich das auch brauch ;) )

die Methode mit IN und dem INNERJOIN hab ich noch nicht ausprobiert :((

Coda
2006-06-30, 16:37:37
blax[/POST]']meines Wissens nach kann man distinct nicht auf einzelne Spalten anwenden, sondern nur auf alle.. :(
Laut Doku geht das aber so.

blax
2006-06-30, 16:43:04
andere frage:
kann es sein, dass Fremdschlüssel in MYSQL irgendwie nicht funktionieren?
Denn
1. Hab ich im PHPMYADMIN auf der Oberfläche nirgens eine möglichkeit gefunden solche anzulegen
2. Hab ich erfolgreich einen Foreign-Key erstellt, der mich aber irgendwie nicht daran hindert, die referenzierte Zeile zu löschen


FAZIT von meiner Seite: Syntaktisch wird es unterstützt. Funktionieren tuts aber nicht.

oder hab ich da was falsch gemacht?

darph
2006-06-30, 17:14:53
Kommt das nicht auf das Setup der Datenbank an?

Ich meine, bei der Installation darauf hingeweisen worden zu sein, daß da bei gewissen Konfigurationen irgendwas mit den Fremdschlüsseln los ist...

blax
2006-06-30, 17:23:36
keine ahnung..
ich arbeite derzeit noch auf XAMPP
und da gibts keine richtige installation

Gast
2006-06-30, 18:37:10
blax[/POST]']oder hab ich da was falsch gemacht?
Hast du InnoDB für die Database verwendet? Mit den anderen Storage Engines kannst du Foreign-Keys vergessen.

Gast
2006-07-01, 08:54:56
Ja, du musst "type = InnoDB" verwenden, dann klappts auch mit den Fremdschlüsseln.

blax
2006-07-01, 10:21:57
kannst du mich da aufklärn, ich kenn mich jetz garnicht mehr aus. Warum gibt es innerhalb einer MYSQL-Datenbank eigentlich noch mehrere "Types"..? Ich wusste nur dass am Ende der von PHPMYADMIN erstellten Tabellen immer type=MYISAM steht. was das heißt wusste ich auch nie :)

lg sevi

Gast
2006-07-01, 10:28:13
Klicke mal auf der Startseite von phpMyAdmin auf "Datenbanken" in der Spalte "MySql". Dann auf die Registerkarte "Formate". Da ist eigentlich alles erklärt.