Vergleich innerhalb eines Datensatzes

Merkler

Neuer Benutzer
Beiträge
2
Hallo,
ich bin Anfänger und stehe vor einem Problem, dieses ich leider unter größten Bemühungen nicht lösen konnte.
Ich möchte nur die Datensätze erhalten worin "p" und "c" gleich sind.
Wie sollte die Abfrage aussehen?
+----------+---------------+------------+---+---+
| seriennr | geraetename-N | kauf datum | p | c |
+----------+---------------+------------+---+---+
| BC323256 | geraetename-1 | 2009-01-11 | 3 | 3 |
| SS571856 | geraetename-2 | 2009-04-30 | 0 | 1 |
| KS193436 | geraetename-3 | 2009-05-04 | 1 | 7 |
| J2536437 | geraetename-4 | 2010-01-02 | 3 | 2 |
| EH499537 | geraetename-5 | 2010-10-22 | 0 | 2 |
| AH980546 | geraetename-6 | 2008-12-01 | 3 | 3 |
| EH499537 | geraetename-7 | 2010-10-22 | 0 | 4 |
| 23975302 | geraetename-8 | 2012-01-22 | 1 | 1 |
| CLL29744 | geraetename-9 | 2008-01-20 | 3 | 6 |
| 23975302 | geraetename-a | 2012-01-22 | 6 | 6 |
| J2536467 | geraetename-b | 2010-01-02 | 3 | 3 |
| CLL29745 | geraetename-c | 2008-01-20 | 3 | 4 |
| CLL29744 | geraetename-d | 2008-01-20 | 3 | 8 |
| KS193480 | geraetename-e | 2009-05-04 | 0 | 1 |
| KSM23469 | geraetename-f | 2009-06-11 | 0 | 9 |
| HM823460 | geraetename-g | 2012-01-20 | 5 | 7 |
+----------+---------------+------------+---+---+
Ich bedanke mich im voraus!

Nette Grüße
 
Werbung:
Hallo,
ich bin Anfänger und stehe vor einem Problem, dieses ich leider unter größten Bemühungen nicht lösen konnte.
Ich möchte nur die Datensätze erhalten worin "p" und "c" gleich sind.

Nette Grüße

Wie genau sahen denn Deine größten Bemühungen aus?

Code:
test=*# select * from merkler ;
 id | p | c
----+---+---
  1 | 1 | 1
  2 | 1 | 3
  3 | 1 | 2
  4 | 5 | 5
(4 rows)

Time: 0,196 ms
test=*# select * from merkler where p=c;
 id | p | c
----+---+---
  1 | 1 | 1
  4 | 5 | 5
(2 rows)

Andreas
 
Danke für Deine schnelle Antwort,
zu meiner Verteidigung meine Abfrage sieht folgender Maßen aus:

select g.gid, geraetename, if(kaufdatum>CURDATE()-20000, DATE_ADD(letztepruefung, INTERVAL 2 year),DATE_ADD(letztepruefung, INTERVAL 1 year)) as 'naechste Pruefung', pruefungsintervall, count(p.verleihid) as verliehen from geraet g join kategorie k on g.kid=k.kid join position p on g.gid=p.geraeteid join verleih v on p.verleihid=v.verleihid group by p.geraeteid;

Daraus entsteht folgende Ausgabe. Aber ich möchte nur die Datensätze erhalten in den pruefungsintervall=verliehen ist. Mit 'wher' habe schon unzählige Versuche gestartet.
Wo sollte ich where in der oben gezeigten Abfrage einbinden?

Code:
+-----+---------------+-------------------+--------------------+-----------+
| gid | geraetename   | naechste Pruefung | pruefungsintervall | verliehen |
+-----+---------------+-------------------+--------------------+-----------+
|   1 | Akkuschrauber | 2014-04-22        |                 10 |         1 |
|   2 | Akkuschrauber | 2014-01-22        |                 10 |         3 |
|   3 | Akkuschrauber | 2014-01-22        |                 10 |         1 |
|   4 | Bohrmaschine  | 2013-10-22        |                 10 |         4 |
|   5 | Bohrmaschine  | 2013-10-22        |                 10 |         3 |
|   6 | Bohrhammer    | 2015-03-01        |                 10 |         1 |
|   7 | Bohrhammer    | 2015-03-01        |                 10 |         1 |
|   8 | Handhobel     | 2013-08-10        |                 10 |         3 |
|   9 | Stichsaege    | 2014-04-30        |                 10 |         3 |
|  10 | Kettensaege   | 2014-05-04        |                 10 |         2 |
|  11 | Kettensaege   | 2014-05-04        |                 10 |         2 |
|  12 | Kettensaege   | 2014-05-04        |                 10 |         2 |
|  13 | Kettensaege   | 2013-06-11        |                 10 |         2 |
|  14 | Kettensaege   | 2013-06-11        |                 10 |         2 |
|  15 | Kettensaege   | 2013-06-11        |                 10 |         2 |
|  16 | Kettensaege   | 2013-06-11        |                 10 |         2 |
|  17 | Mini Radlader | 2014-01-11        |                  3 |         3 |
|  18 | Mini Radlader | 2014-01-11        |                  3 |         1 |
|  19 | Radlader      | 2013-12-01        |                  3 |         4 |
|  20 | Radlader      | 2013-12-01        |                  3 |         2 |
|  21 | Mini Bagger   | 2014-01-02        |                  3 |         3 |
|  22 | Mini Bagger   | 2014-01-02        |                  3 |         3 |
|  23 | Raupenbagger  | 2014-01-20        |                  3 |         3 |
|  24 | Raupenbagger  | 2014-01-20        |                  3 |         1 |
|  25 | Raupenbagger  | 2014-01-20        |                  3 |         2 |
|  26 | Kettenbagger  | 2015-01-20        |                  3 |         1 |
|  27 | Kettenbagger  | 2015-01-20        |                  3 |         2 |
|  28 | Kettenbagger  | 2015-01-20        |                  3 |         1 |
|  29 | Bagger        | 2013-01-20        |                  3 |         3 |
|  30 | Bagger        | 2013-01-20        |                  3 |         2 |
|  31 | Bagger        | 2013-01-20        |                  3 |         1 |
|  32 | Hobelmaschine | 2014-01-20        |                  5 |         1 |
|  33 | Hobelmaschine | 2014-01-20        |                  5 |         1 |
|  34 | Drechselbank  | 2014-08-20        |                  5 |         1 |
|  35 | Drechselbank  | 2014-08-20        |                  5 |         1 |
|  36 | Drechselbank  | 2014-08-20        |                  5 |         1 |
|  37 | Kreissaege    | 2014-04-08        |                  5 |         2 |
|  38 | Kreissaege    | 2014-04-08        |                  5 |         2 |
|  39 | Kreissaege    | 2014-04-08        |                  5 |         2 |
+-----+---------------+-------------------+--------------------+-----------+
39 rows in set (0.00 sec)
 
Danke für Deine schnelle Antwort,
zu meiner Verteidigung meine Abfrage sieht folgender Maßen aus:

select g.gid, geraetename, if(kaufdatum>CURDATE()-20000, DATE_ADD(letztepruefung, INTERVAL 2 year),DATE_ADD(letztepruefung, INTERVAL 1 year)) as 'naechste Pruefung', pruefungsintervall, count(p.verleihid) as verliehen from geraet g join kategorie k on g.kid=k.kid join position p on g.gid=p.geraeteid join verleih v on p.verleihid=v.verleihid group by p.geraeteid;

Daraus entsteht folgende Ausgabe. Aber ich möchte nur die Datensätze erhalten in den pruefungsintervall=verliehen ist. Mit 'wher' habe schon unzählige Versuche gestartet.
Wo sollte ich where in der oben gezeigten Abfrage einbinden?

[/CODE]

Du kannst das Resultat Deiner Abfrage alls Tabelle betrachten und diese wiederum als Quelle der nächsten Abfragen.
Gib der Abfrage einfach einen Alias-Namen und mache weiter.

select * from (select ...) as bla where col1=col2;

Übrigens: Du hast (gemäß der SQL-Spezifikation und auch der Logig) einen massiven Fehler in Deiner Abfrage. Daß Du unter MySQL da keinen Syntax-Fehler bekommst ist eher ein Fehler von MySQL als von Dir. Merke: in Abfragen mit Aggregat-Funktionen wie count(), sum(), max() etc. _MÜSSEN_ alle Spalten, die nicht Bestandteil einer Aggregatfunktion sind, im GROUP BY auftauchen. Insbesondere für Anfänger ist MySQL nicht nur deswegen NICHT zu empfehlen. Und wer einmal andere Systeme kennt nimmt dann kein MySQL.

Andreas
 
Werbung:
Eventuell ließe sich da auch HAVING nutzen, mit dem man für die berechnete Spalte "verliehen" Bedingungen erstellen können müsste. So ungefähr:
Code:
select g.gid, geraetename, if(kaufdatum>CURDATE()-20000, DATE_ADD(letztepruefung, INTERVAL 2 year),DATE_ADD(letztepruefung, INTERVAL 1 year)) as 'naechste Pruefung', pruefungsintervall, count(p.verleihid) as verliehen
from geraet g join kategorie k on g.kid=k.kid join position p on g.gid=p.geraeteid join verleih v on p.verleihid=v.verleihid
group by p.geraeteid
having pruefungsintervall = count(p.verleihid)
Kenne mich aber bei MySQL jetzt auch nicht so gut aus, einfach mal bei HAVING in der Doku schauen.
 
Zurück
Oben