Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Vergleich innerhalb eines Datensatzes

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Merkler, 4 Mai 2013.

  1. Merkler

    Merkler Neuer Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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
     
  3. Merkler

    Merkler Neuer Benutzer

    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)
    
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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
     
  5. ukulele

    ukulele Datenbank-Guru

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden