MySQL: Ungleiche Einträge finden

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Stefan.K
Beiträge: 148
Registriert: 06.03.2003 10:49:06
Wohnort: Schweiz
Kontaktdaten:

MySQL: Ungleiche Einträge finden

Beitrag von Stefan.K » 14.10.2005 14:22:43

Hallo folgendes Problem:

ich möchte vor einem Update erst prüfen, ob sich ein Datensatz geändert hat:

Code: Alles auswählen

SELECT count(id) from table where field1='a' AND (fields2 != 'b' OR fields3 != 'c')
Ich bekomme aber immer 1 als Ergebnis, egal ob sich der Datensatz a geändert hat oder nicht.
Wo ist mein Denkfehler :?:
Ubuntu Gutsy Gibbon, 2.6.20

sowatt
Beiträge: 117
Registriert: 14.03.2003 15:22:56
Wohnort: Hamburg

Beitrag von sowatt » 15.10.2005 05:46:35

Moin,
wieviele Datensätze hast Du in der Tabelle auf die deine Suche zutrifft?

MfG
sowatt

Benutzeravatar
Stefan.K
Beiträge: 148
Registriert: 06.03.2003 10:49:06
Wohnort: Schweiz
Kontaktdaten:

Beitrag von Stefan.K » 17.10.2005 12:27:59

Hi, sorry war nicht am Rechner die letzten Tage.

Die Suchabfrage kann max. auf einen Datensatz zutreffen.
Bsp.

Code: Alles auswählen

feld1    feld2    feld3
a        b        c

Code: Alles auswählen

SELECT count(id) from table where feld1='a' AND (feld2 != 'b' OR feld3 != 'c')
sollte dann doch 0 liefern. Ergebnis ist aber 1
Ubuntu Gutsy Gibbon, 2.6.20

Benutzeravatar
muppets
Beiträge: 142
Registriert: 31.08.2004 21:13:53
Wohnort: Dortmund

Beitrag von muppets » 17.10.2005 13:49:07

Kann es sein, dass da ein bisschen die Begriffe durcheinander geraten sind?
Ein Datensatz ist eine Zeile in einer Datenbank-Tabelle, die Du im Select mit Hilfe der Where-Bedingung, wo Du auf bestimmte Spaltenwerte einschränken kannst, finden kannst.

Beispiel:

Code: Alles auswählen

id  feld1   feld2   feld3
1   a         b         c
2   a         x         c
3   a         b         y
4   a         x         y
In der Tabelle gibt es vier Datensätze, wo die Spalten feld2 und feld3 verschieden gefüllt sind. Mit

Code: Alles auswählen

SELECT count(id) from table where feld1='a' AND (feld2 != 'b' OR feld3 != 'c')
würdest Du in diesem Fall 3 herausbekommen, da die Datensätze mit id 2, 3 und 4 dieser Where-Bedinung entsprechen. Wie Du damit allerdings herausfinden möchtest, ob sich ein Datensatz geändert hat, verstehe ich nicht. Denn wenn sich z.B. im Datensatz mit id 2 die Spalte feld3 auf 'z' ändert, dann ändert sich an dem Ergenis des Selects nichts.

Benutzeravatar
Stefan.K
Beiträge: 148
Registriert: 06.03.2003 10:49:06
Wohnort: Schweiz
Kontaktdaten:

Beitrag von Stefan.K » 17.10.2005 17:50:38

Nö, Feld A ist der PrimaryKey
Ubuntu Gutsy Gibbon, 2.6.20

Benutzeravatar
Bert
Beiträge: 3751
Registriert: 16.07.2002 14:06:52
Wohnort: Dresden
Kontaktdaten:

Beitrag von Bert » 17.10.2005 20:39:51

Ahh, recht nützliche Info. Und 'c' und 'b' sind die alten Werte? Sei doch mal etwas ausführlicher.

Bert
Programmer: A biological machine designed to convert caffeine into code.
xmpp:bert@debianforum.de

Benutzeravatar
muppets
Beiträge: 142
Registriert: 31.08.2004 21:13:53
Wohnort: Dortmund

Beitrag von muppets » 17.10.2005 21:23:13

Genau. Am Besten mit genauer Tabellendefinition. Ich verstehe nämlich immer noch nicht, was bei Dir Spalten oder gar Primary Keys, Datensätze und Werte sind.

Benutzeravatar
Stefan.K
Beiträge: 148
Registriert: 06.03.2003 10:49:06
Wohnort: Schweiz
Kontaktdaten:

Beitrag von Stefan.K » 17.10.2005 21:25:34

Also

Feld A = Primary Key.
Tabelle hat genau zehn Einträge
ID:1 FeldB:a FeldC:v
ID:2 FeldB:b FeldC:w
ID:3 FeldB:c FeldC:x

usw. kein Eintrag ist doppelt vorhanden und trotzem liefert mir die SQL-Abfrage

Code: Alles auswählen

SELECT count(id) from table where id='1' AND (feldB != 'a' OR feldC != 'v')
immer > 0 als Ergebnis.
Ubuntu Gutsy Gibbon, 2.6.20

Benutzeravatar
Stefan.K
Beiträge: 148
Registriert: 06.03.2003 10:49:06
Wohnort: Schweiz
Kontaktdaten:

Beitrag von Stefan.K » 17.10.2005 21:49:32

ARGH!
Sehe gerade, dass die Spalte, die mir der Kunde als PrimaryKey genannt hat, gar kein Primary Key ist :oops:

SORRY!
Ubuntu Gutsy Gibbon, 2.6.20

McClane
Beiträge: 154
Registriert: 28.12.2003 14:00:51

Beitrag von McClane » 17.10.2005 21:50:35

Ist doch auch Sonnenklar.
Bei ID=1 ist FeldB=a und FeldC=v.
In deiner Abfrage fragst du nach ab bei ID=1 FeldB NICHT a und FeldC NICHT v ist. Das trifft ja also zu. Demnach gibt es keine Lösung und count() zählt 0.

Benutzeravatar
muppets
Beiträge: 142
Registriert: 31.08.2004 21:13:53
Wohnort: Dortmund

Beitrag von muppets » 17.10.2005 21:59:06

Wenn es wirklich einen Datensatz mit diesen Werten gibt:
Stefan.K hat geschrieben:ID:1 FeldB:a FeldC:v
Dann verstehe ich auch nicht, warum

Code: Alles auswählen

SELECT count(id) from table where id='1' AND (feldB != 'a' OR feldC != 'v')
immer > 0 ist. :?

PrimaryKey FeldA hast Du aber nur zur Verwirrung angegeben?, Denn das taucht in Deinem Beispieldatensätzen gar nicht auf. Oder welche Rolle spielt das?

Benutzeravatar
muppets
Beiträge: 142
Registriert: 31.08.2004 21:13:53
Wohnort: Dortmund

Beitrag von muppets » 17.10.2005 22:00:27

McClane hat geschrieben:Das trifft ja also zu. Demnach gibt es keine Lösung und count() zählt 0.
Aber das Problem war doch gerade, dass das Ergebnis >0 und nicht =0 ist.

Antworten