Zwei SQL Auswertungen vergleichen?
Zwei SQL Auswertungen vergleichen?
am 10.06.2006 11:18:37 von Ralf Miller
Hallo Leute,
ich habe folgende Tabelle:
ID | Jahr | Bname | Gesperrt | Superrechte |
------------------------------------------------------------ -
1 | 2004 | User1 | 0 | 0 |
2 | 2004 | User2 | 0 | 1 |
3 | 2004 | User3 | 1 | 0 |
4 | 2004 | User4 | 0 | 0 |
5 | 2005 | User1 | 0 | 0 |
6 | 2005 | User3 | 0 | 0 |
7 | 2005 | User4 | 0 | 1 |
8 | 2005 | User5 | 0 | 0 |
------------------------------------------------------------ -
Nun möchte ich gerne einzene Jahre vergleichen. Also welche Änderungen
es bei den User gibt.
Ich möchte also alle Einträge aus 2004 mit den Werten 2005 vergleichen
und am besten folgendermaßen ausgeben:
2004 2005 Veränderung
-----------------------------------------
User1 User1 Keine Veränderung
User2 User gelöscht
User3 User3 Sperrung geändert
User4 User4 Superrechte hinzugefügt
User5 Neue User hinzugefügt
-----------------------------------------
Ist sowas möglich? Im moment steh ich nämlich wirklich auf dem Schlauch
und weiß nicht, wie ich das ganze am besten angehen soll. Hat da jemand
eine Idee?
Das wäre super wenn ich ein paar Tipps bekommen könnte.
Grüße und Danke
Ralf
Re: Zwei SQL Auswertungen vergleichen?
am 10.06.2006 12:00:14 von Achim Peters
Ralf Miller wrote:
> ich habe folgende Tabelle:
>
> ID | Jahr | Bname | Gesperrt | Superrechte |
> ------------------------------------------------------------ -
> 1 | 2004 | User1 | 0 | 0 |
> 2 | 2004 | User2 | 0 | 1 |
> 3 | 2004 | User3 | 1 | 0 |
> 4 | 2004 | User4 | 0 | 0 |
> 5 | 2005 | User1 | 0 | 0 |
> 6 | 2005 | User3 | 0 | 0 |
> 7 | 2005 | User4 | 0 | 1 |
> 8 | 2005 | User5 | 0 | 0 |
> ------------------------------------------------------------ -
>
> Nun möchte ich gerne einzene Jahre vergleichen. Also welche Änderungen
> es bei den User gibt.
> Ich möchte also alle Einträge aus 2004 mit den Werten 2005 vergleichen
> und am besten folgendermaßen ausgeben:
>
> 2004 2005 Veränderung
> -----------------------------------------
> User1 User1 Keine Veränderung
> User2 User gelöscht
> User3 User3 Sperrung geändert
> User4 User4 Superrechte hinzugefügt
> User5 Neue User hinzugefügt
> -----------------------------------------
>
> Ist sowas möglich?
Zumindest schonmal trivial als Schleife. Oder meinst Du zwingend in
einem einzigen SQL-Statement?
Du kannst Dir zumindest die Werte von 2004 jeweils neben die von 2005
stellen. Ungetestet
SELECT
A.Bname,
B.Bname as NameNeu,
A.Gesperrt,
B.Gesperrt as GesperrtNeu,
A.Superrechte,
B.Superrechte as SuperrechteNeu
FROM
MyTable A LEFT OUTER JOIN MyTable B
WHERE
A.Bname = B.Bname
Dann kannst Du in einer Row die alten und neuen Werte eines Users
auswerten und Dein print machen.
Ich weiß im Moment nicht auswendig, ob das klappt, wenn ein User in 2005
neu dazugekommen ist.
HTH
Bye
Achim
Re: Zwei SQL Auswertungen vergleichen?
am 10.06.2006 18:04:58 von Ralf Miller
On 2006-06-10 12:00:14 +0200, Achim Peters said:
> Ralf Miller wrote:
>> ich habe folgende Tabelle:
>>
>> ID | Jahr | Bname | Gesperrt | Superrechte |
>> ------------------------------------------------------------ -
>> 1 | 2004 | User1 | 0 | 0 |
>> 2 | 2004 | User2 | 0 | 1 |
>> 3 | 2004 | User3 | 1 | 0 |
>> 4 | 2004 | User4 | 0 | 0 |
>> 5 | 2005 | User1 | 0 | 0 |
>> 6 | 2005 | User3 | 0 | 0 |
>> 7 | 2005 | User4 | 0 | 1 |
>> 8 | 2005 | User5 | 0 | 0 |
>> ------------------------------------------------------------ -
>>
>> Nun möchte ich gerne einzene Jahre vergleichen. Also welche Änderungen
>> es bei den User gibt.
>> Ich möchte also alle Einträge aus 2004 mit den Werten 2005 vergleichen
>> und am besten folgendermaßen ausgeben:
>>
>> 2004 2005 Veränderung
>> -----------------------------------------
>> User1 User1 Keine Veränderung
>> User2 User gelöscht
>> User3 User3 Sperrung geändert
>> User4 User4 Superrechte hinzugefügt
>> User5 Neue User hinzugefügt
>> -----------------------------------------
>>
>> Ist sowas möglich?
>
> Zumindest schonmal trivial als Schleife. Oder meinst Du zwingend in
> einem einzigen SQL-Statement?
>
> Du kannst Dir zumindest die Werte von 2004 jeweils neben die von 2005
> stellen. Ungetestet
>
> SELECT
> A.Bname,
> B.Bname as NameNeu,
> A.Gesperrt,
> B.Gesperrt as GesperrtNeu,
> A.Superrechte,
> B.Superrechte as SuperrechteNeu
> FROM
> MyTable A LEFT OUTER JOIN MyTable B
> WHERE
> A.Bname = B.Bname
>
> Dann kannst Du in einer Row die alten und neuen Werte eines Users
> auswerten und Dein print machen.
>
> Ich weiß im Moment nicht auswendig, ob das klappt, wenn ein User in 2005
> neu dazugekommen ist.
>
> HTH
>
> Bye
> Achim
Hy,
vielen Dank für die erste Hilfe. Aber ganz bekomme ich es noch nicht hin.
Ich habe jetzt mal den SQL Befehl angepasst und bin auf folgenden
Befehl gekommen:
Select
A.Bname,
B.Bname as NameNeu
From
MyTable A left outer join MyTable B
ON
A.Bname = B.Bname
Where
A.Jahr = 2004 and B.Jahr = 2005
Das Problem ist nun wenn man meine Tabelle von vorher verwendet,
liefert mir diese Abfrage folgende Tabelle:
2004 2005
------------------------
User1 User1
User3 User3
User4 User4
Es liefert mir halt leider nicht die User die hinzugefügt wurden, oder
die entfernt wurden. Schön wäre es wenn das Ergebnis folgendermaßen
aussehen würde. (Die Detaillierte Auswertung was verändert wurde, würde
ich dann in PHP in schleifen machen):
2004 2005
------------------------
User1 User1
User2 -
User3 User3
User4 User4
- User5
Bekommt man das irgendwie mit SQL hin? Oder muss ich in PHP mehrere
abfragen machen?
Es wäre halt schön wenn man das veremiden könnte, sondern wenn man die
Tabelle mit einem SQL Statement so ausgeben könnte. (Anstatt den - kann
auch gern nichts stehen oder NULL oder was anderes.)
Vielleicht kann mir hier jemand noch ein bißchen weiterhelfen.
Grüße
Ralf
Re: Zwei SQL Auswertungen vergleichen?
am 10.06.2006 18:11:02 von Niels Braczek
Ralf Miller schrieb:
> Es liefert mir halt leider nicht die User die hinzugefügt wurden, ode=
r=20
> die entfernt wurden. Schön wäre es wenn das Ergebnis folgendermaß=
en=20
> aussehen würde. (Die Detaillierte Auswertung was verändert wurde, w=
ürde=20
> ich dann in PHP in schleifen machen):
> 2004 2005
> ------------------------
> User1 User1
> User2 -
> User3 User3
> User4 User4
> - User5
>=20
> Bekommt man das irgendwie mit SQL hin?
Ja, steht im Manual:
http://dev.mysql.com/doc/refman/4.1/en/join.html
> Oder muss ich in PHP mehrere abfragen machen?
Kann man. Aber man macht nichts im Skript, das das DBMS erledigen kann.
--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Re: Zwei SQL-Auswertungen vergleichen?
am 10.06.2006 18:40:14 von Thomas Rachel
Ralf Miller wrote:
> vielen Dank für die erste Hilfe. Aber ganz bekomme ich es noch nicht
> hin. Ich habe jetzt mal den SQL Befehl angepasst und bin auf folgenden
^-
> Befehl gekommen:
> Select
> A.Bname,
> B.Bname as NameNeu
> From
> MyTable A left outer join MyTable B
> ON
> A.Bname = B.Bname
> Where
> A.Jahr = 2004 and B.Jahr = 2005
Diese WHERE-Bedingung macht das LEFT OUTER JOIN überflüssig. Dessen Zweck
ist es ja, in B nicht existente Zeilen auf NULL zu setzen. Daher gehört
die Bedingung für die B-Zeile in das ON, hier also:
....
ON
A.Bname = B.Bname and B.Jahr = 2005
Where
A.Jahr = 2004
Seltsamerweise scheint sowas nicht zu funktionieren, wenn ich die
A.Jahr=2004-Bedingung auch ins ON verschiebe. Habe ich jetzt aktuell
nicht getestet, meine ich aber von vorherigen Problemen her zu kennen.
Weiteres Problem - so bekommst Du zwar die in B fehlenden Werte, aber
nicht die neuen. Dafür bräuchtest Du entweder ein FULL OUTER JOIN (gibts
aber in MySQL nicht), oder Du arbeitest mit UNION und schiebst oben
hinterher:
UNION
SELECT ...
FROM
MyTable A RIGHT outer join MyTable B
/* oder MyTable B LEFT outer join MyTable A, um SQL-kompatibel zu
bleiben */
ON A.Bname = B.Bname and A.Jahr = 2004
WHERE B.Jahr=2005
Das sollte es dann tun.
Allerdings ist dies ein reines SQL-Problem und wäre daher in dcd
{misc,mysql} OnTopic gewesen.
HTH,
Thomas
--
Wos hom's gsogt? Nix hom's gsogt! Rausgschmissn homs mi!
Re: Zwei SQL Auswertungen vergleichen?
am 10.06.2006 20:52:47 von Ralf Miller
On 2006-06-10 18:11:02 +0200, Niels Braczek said:
> Ralf Miller schrieb:
>
>> Es liefert mir halt leider nicht die User die hinzugefügt wurden, ode
> r
>> die entfernt wurden. Schön wäre es wenn das Ergebnis folgendermaß
> en
>> aussehen würde. (Die Detaillierte Auswertung was verändert wurde, w
> ürde
>> ich dann in PHP in schleifen machen):
>> 2004 2005
>> ------------------------
>> User1 User1
>> User2 -
>> User3 User3
>> User4 User4
>> - User5
>>
>> Bekommt man das irgendwie mit SQL hin?
>
> Ja, steht im Manual:
> http://dev.mysql.com/doc/refman/4.1/en/join.html
>
>> Oder muss ich in PHP mehrere abfragen machen?
>
> Kann man. Aber man macht nichts im Skript, das das DBMS erledigen kann.
Hy,
irgend wie versteh ich fas Manual an der Stelle nicht wirklich. Denn
dort find ich leider nur ein Beispiel, das nur die Werte ausgibt, die
nicht in B drin sind. Und irgendwie bekomme ich das Beispiel dort nicht
erläutert.
Können Sie mir hier noch einen Tipp geben, wie man das macht, dass das
oben gewünschte Ergebnis rauskommt.
Grüße und Danke
Ralf
Re: Zwei SQL-Auswertungen vergleichen?
am 10.06.2006 20:56:34 von Ralf Miller
On 2006-06-10 18:40:14 +0200, Thomas Rachel
said:
> Ralf Miller wrote:
>
>> vielen Dank für die erste Hilfe. Aber ganz bekomme ich es noch nicht
>> hin. Ich habe jetzt mal den SQL Befehl angepasst und bin auf folgenden
> ^-
>> Befehl gekommen:
>
>> Select
>> A.Bname,
>> B.Bname as NameNeu
>> From
>> MyTable A left outer join MyTable B
>> ON
>> A.Bname = B.Bname
>> Where
>> A.Jahr = 2004 and B.Jahr = 2005
>
> Diese WHERE-Bedingung macht das LEFT OUTER JOIN überflüssig. Dessen Zweck
> ist es ja, in B nicht existente Zeilen auf NULL zu setzen. Daher gehört
> die Bedingung für die B-Zeile in das ON, hier also:
>
> ... ON
> A.Bname = B.Bname and B.Jahr = 2005
> Where
> A.Jahr = 2004
> Seltsamerweise scheint sowas nicht zu funktionieren, wenn ich die
> A.Jahr=2004-Bedingung auch ins ON verschiebe. Habe ich jetzt aktuell
> nicht getestet, meine ich aber von vorherigen Problemen her zu kennen.
>
>
> Weiteres Problem - so bekommst Du zwar die in B fehlenden Werte, aber
> nicht die neuen. Dafür bräuchtest Du entweder ein FULL OUTER JOIN (gibts
> aber in MySQL nicht), oder Du arbeitest mit UNION und schiebst oben
> hinterher:
>
> UNION
> SELECT ...
> FROM
> MyTable A RIGHT outer join MyTable B
> /* oder MyTable B LEFT outer join MyTable A, um SQL-kompatibel zu
> bleiben */
> ON A.Bname = B.Bname and A.Jahr = 2004
> WHERE B.Jahr=2005
>
> Das sollte es dann tun.
>
>
> Allerdings ist dies ein reines SQL-Problem und wäre daher in dcd
> {misc,mysql} OnTopic gewesen.
>
>
> HTH,
>
> Thomas
Das hatte ich auch erst gedacht. Lass ich aber die Where klausel weg,
dann liefert der Innerjoin aber auch sich selber. Soll heißen wenn
User1 im Jahr 2004 und 2005 vorkommt erscheint er genau 2mal:
2004 2005
-----------------------
User1 User1
User1 User1
Taucht er nur im Jahr 2004 auf erscheint er auch einmal aber in beiden Spalten
2004 2005
------------------------
User1 User1
Deswegen hbae ich die Where Klausel so eingefügt.
Das Beispiel von Ihnen funktiniert leider bei mir nicht. Da gibt es
Syntaxfehler?
Tipps?
Grüße und Danke
Ralf
Re: Zwei SQL Auswertungen vergleichen?
am 12.06.2006 22:32:58 von Ralf Miller
Hallo,
jetzt habe ich noch ein wenig mehr rumgebastelt hab es aber noch nicht
komplett hinbekommen.
Folgende Beispiel Tabellen habe ich aufgebaut:
Create table tmpAuswVJ(
ID integer Auto_increment,
Bname char(50),
Zuord integer,
Primary Key(ID)
);
Create table tmpAuswGJ(
ID integer Auto_increment,
Bname char(50),
Zuord integer,
Primary Key(ID)
);
Erster Test VJ Tabelle
INSERT INTO tmpAuswVJ (Bname,Zuord) VALUES ('User1',0);
INSERT INTO tmpAuswVJ (Bname,Zuord) VALUES ('User2',0);
INSERT INTO tmpAuswVJ (Bname,Zuord) VALUES ('User3',0);
INSERT INTO tmpAuswVJ (Bname,Zuord) VALUES ('User4',0);
Zweiter Test GJ Tabelle
INSERT INTO tmpAuswGJ (Bname,Zuord) VALUES ('User1',0);
INSERT INTO tmpAuswGJ (Bname,Zuord) VALUES ('User3',0);
INSERT INTO tmpAuswGJ (Bname,Zuord) VALUES ('User4',0);
INSERT INTO tmpAuswGJ (Bname,Zuord) VALUES ('User5',0);
Die Tabelle sehen jetzt so aus:
tmpAuswVJ:
+----+-------+-------+
| ID | Bname | Zuord |
+----+-------+-------+
| 1 | User1 | 0 |
| 2 | User2 | 0 |
| 3 | User3 | 0 |
| 4 | User4 | 0 |
+----+-------+-------+
tmpAuswGJ:
+----+-------+-------+
| ID | Bname | Zuord |
+----+-------+-------+
| 1 | User1 | 0 |
| 2 | User3 | 0 |
| 3 | User4 | 0 |
| 4 | User5 | 0 |
+----+-------+-------+
Erhalten möchte ich gern per SQL Befehl folgende Auswertung:
2004 2005
------------------------
User1 User1
User2 -
User3 User3
User4 User4
- User5
Angenähert habe ich mich nun mit folgender Auswertung:
Select tmpAuswVJ.Bname, tmpAuswGJ.Bname as BnameGJ FROM tmpAuswVJ LEFT
OUTER JOIN tmpAuswGJ ON tmpAuswVJ.Bname = tmpAuswGJ.Bname;
Der folgendes Ergebnis liefert:
+-------+---------+
| Bname | BnameGJ |
+-------+---------+
| User1 | User1 |
| User2 | NULL |
| User3 | User3 |
| User4 | User4 |
+-------+---------+
Nur leider liefert er nicht das Ergebnis das ich will, da er hier nur
die Tabelle 1 durchläuft nicht aber auch umgekehrt.
Weiß jemand wie ich den SQL Befehl anpassen muss, dass er mir auch noch
die Werte aus Tabelle2 gegen Tabelle1 prüft und nicht nur umgekehrt?
Ich bin mit meinem Latein am Ende.
Danke
Grüße
Ralf
On 2006-06-10 18:04:58 +0200, Ralf Miller said:
> On 2006-06-10 12:00:14 +0200, Achim Peters said:
>
>> Ralf Miller wrote:
>>> ich habe folgende Tabelle:
>>>
>>> ID | Jahr | Bname | Gesperrt | Superrechte |
>>> ------------------------------------------------------------ -
>>> 1 | 2004 | User1 | 0 | 0 |
>>> 2 | 2004 | User2 | 0 | 1 |
>>> 3 | 2004 | User3 | 1 | 0 |
>>> 4 | 2004 | User4 | 0 | 0 |
>>> 5 | 2005 | User1 | 0 | 0 |
>>> 6 | 2005 | User3 | 0 | 0 |
>>> 7 | 2005 | User4 | 0 | 1 |
>>> 8 | 2005 | User5 | 0 | 0 |
>>> ------------------------------------------------------------ -
>>>
>>> Nun möchte ich gerne einzene Jahre vergleichen. Also welche Änderungen
>>> es bei den User gibt.
>>> Ich möchte also alle Einträge aus 2004 mit den Werten 2005 vergleichen
>>> und am besten folgendermaßen ausgeben:
>>>
>>> 2004 2005 Veränderung
>>> -----------------------------------------
>>> User1 User1 Keine Veränderung
>>> User2 User gelöscht
>>> User3 User3 Sperrung geändert
>>> User4 User4 Superrechte hinzugefügt
>>> User5 Neue User hinzugefügt
>>> -----------------------------------------
>>>
>>> Ist sowas möglich?
>>
>> Zumindest schonmal trivial als Schleife. Oder meinst Du zwingend in
>> einem einzigen SQL-Statement?
>>
>> Du kannst Dir zumindest die Werte von 2004 jeweils neben die von 2005
>> stellen. Ungetestet
>>
>> SELECT
>> A.Bname,
>> B.Bname as NameNeu,
>> A.Gesperrt,
>> B.Gesperrt as GesperrtNeu,
>> A.Superrechte,
>> B.Superrechte as SuperrechteNeu
>> FROM
>> MyTable A LEFT OUTER JOIN MyTable B
>> WHERE
>> A.Bname = B.Bname
>>
>> Dann kannst Du in einer Row die alten und neuen Werte eines Users
>> auswerten und Dein print machen.
>>
>> Ich weiß im Moment nicht auswendig, ob das klappt, wenn ein User in 2005
>> neu dazugekommen ist.
>>
>> HTH
>>
>> Bye
>> Achim
>
> Hy,
>
> vielen Dank für die erste Hilfe. Aber ganz bekomme ich es noch nicht hin.
> Ich habe jetzt mal den SQL Befehl angepasst und bin auf folgenden
> Befehl gekommen:
>
> Select
> A.Bname,
> B.Bname as NameNeu
> From
> MyTable A left outer join MyTable B
> ON
> A.Bname = B.Bname
> Where
> A.Jahr = 2004 and B.Jahr = 2005
>
> Das Problem ist nun wenn man meine Tabelle von vorher verwendet,
> liefert mir diese Abfrage folgende Tabelle:
> 2004 2005
> ------------------------
> User1 User1
> User3 User3
> User4 User4
>
> Es liefert mir halt leider nicht die User die hinzugefügt wurden, oder
> die entfernt wurden. Schön wäre es wenn das Ergebnis folgendermaßen
> aussehen würde. (Die Detaillierte Auswertung was verändert wurde, würde
> ich dann in PHP in schleifen machen):
> 2004 2005
> ------------------------
> User1 User1
> User2 -
> User3 User3
> User4 User4
> - User5
>
> Bekommt man das irgendwie mit SQL hin? Oder muss ich in PHP mehrere
> abfragen machen?
> Es wäre halt schön wenn man das veremiden könnte, sondern wenn man die
> Tabelle mit einem SQL Statement so ausgeben könnte. (Anstatt den - kann
> auch gern nichts stehen oder NULL oder was anderes.)
>
> Vielleicht kann mir hier jemand noch ein bißchen weiterhelfen.
>
> Grüße
> Ralf
Re: Zwei SQL Auswertungen vergleichen?
am 13.06.2006 07:57:13 von Ralf Miller
Morgen,
für die die es Interessiert:
Ich habe jetzt noch ein wenig gebastelt:
Folgendes Statement liefert mir die gewünschte Tabelle:
Select tmpAuswVJ.Bname, tmpAuswGJ.Bname as BnameGJ FROM tmpAuswVJ LEFT
OUTER JOIN tmpAuswGJ ON tmpAuswVJ.Bname = tmpAuswGJ.Bname UNION Select
tmpAuswVJ.Bname, tmpAuswGJ.Bname as BnameGJ FROM tmpAuswGJ LEFT OUTER
JOIN tmpAuswVJ ON tmpAuswVJ.Bname = tmpAuswGJ.Bname;
+-------+---------+
| Bname | BnameGJ |
+-------+---------+
| User1 | User1 |
| User2 | NULL |
| User3 | User3 |
| User4 | User4 |
| NULL | User5 |
+-------+---------+
Die Frage ist nur ob ich da nicht um 5 Ecken gedacht habe und es nicht
vielleicht einfacher gehen würde?
Grüße
Ralf
On 2006-06-12 22:32:58 +0200, Ralf Miller said:
> Hallo,
> jetzt habe ich noch ein wenig mehr rumgebastelt hab es aber noch nicht
> komplett hinbekommen.
> Folgende Beispiel Tabellen habe ich aufgebaut:
>
> Create table tmpAuswVJ(
> ID integer Auto_increment,
> Bname char(50),
> Zuord integer,
> Primary Key(ID)
> );
>
> Create table tmpAuswGJ(
> ID integer Auto_increment,
> Bname char(50),
> Zuord integer,
> Primary Key(ID)
> );
>
> Erster Test VJ Tabelle
> INSERT INTO tmpAuswVJ (Bname,Zuord) VALUES ('User1',0);
> INSERT INTO tmpAuswVJ (Bname,Zuord) VALUES ('User2',0);
> INSERT INTO tmpAuswVJ (Bname,Zuord) VALUES ('User3',0);
> INSERT INTO tmpAuswVJ (Bname,Zuord) VALUES ('User4',0);
>
> Zweiter Test GJ Tabelle
> INSERT INTO tmpAuswGJ (Bname,Zuord) VALUES ('User1',0);
> INSERT INTO tmpAuswGJ (Bname,Zuord) VALUES ('User3',0);
> INSERT INTO tmpAuswGJ (Bname,Zuord) VALUES ('User4',0);
> INSERT INTO tmpAuswGJ (Bname,Zuord) VALUES ('User5',0);
>
> Die Tabelle sehen jetzt so aus:
> tmpAuswVJ:
> +----+-------+-------+
> | ID | Bname | Zuord |
> +----+-------+-------+
> | 1 | User1 | 0 |
> | 2 | User2 | 0 |
> | 3 | User3 | 0 |
> | 4 | User4 | 0 |
> +----+-------+-------+
> tmpAuswGJ:
> +----+-------+-------+
> | ID | Bname | Zuord |
> +----+-------+-------+
> | 1 | User1 | 0 |
> | 2 | User3 | 0 |
> | 3 | User4 | 0 |
> | 4 | User5 | 0 |
> +----+-------+-------+
>
> Erhalten möchte ich gern per SQL Befehl folgende Auswertung:
> 2004 2005
> ------------------------
> User1 User1
> User2 -
> User3 User3
> User4 User4
> - User5
>
> Angenähert habe ich mich nun mit folgender Auswertung:
> Select tmpAuswVJ.Bname, tmpAuswGJ.Bname as BnameGJ FROM tmpAuswVJ LEFT
> OUTER JOIN tmpAuswGJ ON tmpAuswVJ.Bname = tmpAuswGJ.Bname;
>
> Der folgendes Ergebnis liefert:
> +-------+---------+
> | Bname | BnameGJ |
> +-------+---------+
> | User1 | User1 |
> | User2 | NULL |
> | User3 | User3 |
> | User4 | User4 |
> +-------+---------+
>
> Nur leider liefert er nicht das Ergebnis das ich will, da er hier nur
> die Tabelle 1 durchläuft nicht aber auch umgekehrt.
> Weiß jemand wie ich den SQL Befehl anpassen muss, dass er mir auch noch
> die Werte aus Tabelle2 gegen Tabelle1 prüft und nicht nur umgekehrt?
> Ich bin mit meinem Latein am Ende.
> Danke
> Grüße
> Ralf
>
>
> On 2006-06-10 18:04:58 +0200, Ralf Miller said:
>
>> On 2006-06-10 12:00:14 +0200, Achim Peters said:
>>
>>> Ralf Miller wrote:
>>>> ich habe folgende Tabelle:
>>>>
>>>> ID | Jahr | Bname | Gesperrt | Superrechte |
>>>> ------------------------------------------------------------ -
>>>> 1 | 2004 | User1 | 0 | 0 |
>>>> 2 | 2004 | User2 | 0 | 1 |
>>>> 3 | 2004 | User3 | 1 | 0 |
>>>> 4 | 2004 | User4 | 0 | 0 |
>>>> 5 | 2005 | User1 | 0 | 0 |
>>>> 6 | 2005 | User3 | 0 | 0 |
>>>> 7 | 2005 | User4 | 0 | 1 |
>>>> 8 | 2005 | User5 | 0 | 0 |
>>>> ------------------------------------------------------------ -
>>>>
>>>> Nun möchte ich gerne einzene Jahre vergleichen. Also welche Änderungen
>>>> es bei den User gibt.
>>>> Ich möchte also alle Einträge aus 2004 mit den Werten 2005 vergleichen
>>>> und am besten folgendermaßen ausgeben:
>>>>
>>>> 2004 2005 Veränderung
>>>> -----------------------------------------
>>>> User1 User1 Keine Veränderung
>>>> User2 User gelöscht
>>>> User3 User3 Sperrung geändert
>>>> User4 User4 Superrechte hinzugefügt
>>>> User5 Neue User hinzugefügt
>>>> -----------------------------------------
>>>>
>>>> Ist sowas möglich?
>>>
>>> Zumindest schonmal trivial als Schleife. Oder meinst Du zwingend in
>>> einem einzigen SQL-Statement?
>>>
>>> Du kannst Dir zumindest die Werte von 2004 jeweils neben die von 2005
>>> stellen. Ungetestet
>>>
>>> SELECT
>>> A.Bname,
>>> B.Bname as NameNeu,
>>> A.Gesperrt,
>>> B.Gesperrt as GesperrtNeu,
>>> A.Superrechte,
>>> B.Superrechte as SuperrechteNeu
>>> FROM
>>> MyTable A LEFT OUTER JOIN MyTable B
>>> WHERE
>>> A.Bname = B.Bname
>>>
>>> Dann kannst Du in einer Row die alten und neuen Werte eines Users
>>> auswerten und Dein print machen.
>>>
>>> Ich weiß im Moment nicht auswendig, ob das klappt, wenn ein User in 2005
>>> neu dazugekommen ist.
>>>
>>> HTH
>>>
>>> Bye
>>> Achim
>>
>> Hy,
>>
>> vielen Dank für die erste Hilfe. Aber ganz bekomme ich es noch nicht hin.
>> Ich habe jetzt mal den SQL Befehl angepasst und bin auf folgenden
>> Befehl gekommen:
>>
>> Select
>> A.Bname,
>> B.Bname as NameNeu
>> From
>> MyTable A left outer join MyTable B
>> ON
>> A.Bname = B.Bname
>> Where
>> A.Jahr = 2004 and B.Jahr = 2005
>>
>> Das Problem ist nun wenn man meine Tabelle von vorher verwendet,
>> liefert mir diese Abfrage folgende Tabelle:
>> 2004 2005
>> ------------------------
>> User1 User1
>> User3 User3
>> User4 User4
>>
>> Es liefert mir halt leider nicht die User die hinzugefügt wurden, oder
>> die entfernt wurden. Schön wäre es wenn das Ergebnis folgendermaßen
>> aussehen würde. (Die Detaillierte Auswertung was verändert wurde, würde
>> ich dann in PHP in schleifen machen):
>> 2004 2005
>> ------------------------
>> User1 User1
>> User2 -
>> User3 User3
>> User4 User4
>> - User5
>>
>> Bekommt man das irgendwie mit SQL hin? Oder muss ich in PHP mehrere
>> abfragen machen?
>> Es wäre halt schön wenn man das veremiden könnte, sondern wenn man die
>> Tabelle mit einem SQL Statement so ausgeben könnte. (Anstatt den - kann
>> auch gern nichts stehen oder NULL oder was anderes.)
>>
>> Vielleicht kann mir hier jemand noch ein bißchen weiterhelfen.
>>
>> Grüße
>> Ralf
Re: Zwei SQL Auswertungen vergleichen?
am 15.06.2006 16:21:49 von Alex Hepp
Ralf Miller schrieb:
> Morgen,
> für die die es Interessiert:
> Ich habe jetzt noch ein wenig gebastelt:
allerdings gebastelt ;)
> Die Frage ist nur ob ich da nicht um 5 Ecken gedacht habe und es nicht
> vielleicht einfacher gehen würde?
Meiner Meinung nach schon, denn so ein Statement sollte doch
hinzubekommen sein.
Ich hab das jetzt weder getestet, noch auf Herz und Nieren geprüft, und
hoffe mal, dass ich Dich richtig verstanden habe, aber meiner Meinung
nach sollte das hier so funktionieren, allerdings gibt der nur aus,
welche sich geändert haben(das andere kann man dann evtl. mit subquery
machen und minus zb.):
select A.BNAME Username, 'Sperrung geändert' Unterschied from testtable
A, testtable B
where A.BNAME = B.BNAME AND A.JAHR = 2004 AND B.JAHR = 2005
AND A.LOCKED!=B.LOCKED
UNION
select A.BNAME Username, 'Rechte geändert' Unterschied from testtable A,
testtable B
where A.BNAME = B.BNAME AND A.Jahr = 2004 AND B.JAHR = 2005
AND A.SUPERR!=B.SUPERR
UNION
select A.BNAME Username, 'User gelöscht' Unterschied from testtable A
left join testtable B ON A.BNAME = B.BNAME AND B.JAHR='2005'
where A.JAHR = '2004' AND B.BNAME is null
UNION
select A.BNAME Username, 'User hinzugefügt' Unterschied from testtable A
left join testtable B ON A.BNAME = B.BNAME AND B.JAHR='2004'
where A.JAHR = '2005' AND B.BNAME is null
Ich lasse mich gerne berichtigen, wenn ich etwas nicht bedacht haben
sollte...
HTH.
alex