MySql Datenbank

  • Hallo zusammen,


    Ich habe folgendes Problem:
    Ich habe 1 Tabelle nennen wir sie "einsätze"
    Auf dieser Tabelle hat es eine Spalte "AnlagenNr" und eine Spalte "einsaetze"


    In dieser Tabelle kann die "AnlagenNr." mehrmals vorkommen da alle Einsätze die getätigt wurden eingetragen sind.


    Zb:


    AnlageNr / Einsaetze
    21 / 21.02.2013
    23 / 23.02.2011
    21 / 21.02.2014
    23 / 26.02.2013


    Ergebniss:
    23 / 26.02.2013 da dieser nicht in 2014 vorkommt.



    Nun würe ich gerne alle Anlagen Nummern ausgeben bei der das aktuellste Einsatzdatum im Jahre 2013 war und nicht in 2014 oder früher als 2013 vorkommt.


    Ist dies möglich?


    Vielen Dank für eure Hilfe

    Dieser Beitrag wurde bereits 3 Mal editiert, zuletzt von schnibli ()

  • Nun, da brauchst du grundlegend erstmal eine

    SQL
    1. SELCT ... WHERE

    Abfrage.
    Falls deine Spalte "Einsaetze" als Datentyp DATE ist, könntest du das ungefähr so aussehen lassen:

    SQL
    1. SELECT .. WHERE `Einsaetze` >= '2013-01-01' AND `Einsaetze` <= '2013-12-31'


    Falls es ein anderer Datentyp ist, weiß ich nicht, ob das "<= AND >=" funktioniert, ich vermute, dass nein.

  • Ich habe jetzt die Abfrage so angepasst:

    SQL
    1. $sql = 'SELECT *
    2. FROM tblServiceDaten
    3. WHERE' ´ServiceDatum´ >= '2013-01-01' AND ´Servicedatum´ <= '2013-12-31';


    Jedoch wird mir nichts ausgegeben, habe ich einen fehler mit den hochkommas? :s

  • Da wundert es mich, dass du keinen Fehler von PHP geworfen bekommst - hast du die Fehlermeldungen abgestellt?
    Probier mal:

    PHP
    1. $sql = "SELECT *
    2. FROM tblServiceDaten
    3. WHERE ´ServiceDatum´ >= '2013-01-01' AND ´Servicedatum´ <= '2013-12-31";
  • Hallo, hab es jetzt mit deinem Code Probiert:
    Folgende Fehlermeldung wird angezeigt:

    SQL
    1. Fatal error: Call to undefined method mysqli::error() in /volume1/web/anlagen/auszuf_service.inc.php on line 10


    Mein Code:


    Die Spalte ServiceDaten ist in Date Formatiert


    Folgende Fehler habe ich schon gefunden:
    Servicedatum wird das 2 mal falsch geschrieben:

    SQL
    1. $sql = "SELECT *
    2. FROM tblServiceDaten
    3. WHERE ´ServiceDatum´ >= '2013-01-01' AND ´ServiceDatum´ <= '2013-12-31";


    jedoch keine änderung ... immernoch den gleichen fehler



    So hab es geschafft:

    SQL
    1. $sql = "SELECT *
    2. FROM tblServiceDaten
    3. WHERE `ServiceDatum` >= '2013-01-01' AND `ServiceDatum` <= '2013-12-31'";


    Wie kann ich jetzt diejenigen ausblenden die in 2014 auch vorkommen?


    Hallo,


    Ich habe dies Versucht:


    SQL
    1. $sql = "SELECT * FROM `tblServiceDaten`
    2. GROUP BY `AnlagenNr` ORDER BY `ServiceDatum` ASC";


    Jedoch kommt nicht immer der Aktuelle Datensatz

    Dieser Beitrag wurde bereits 2 Mal editiert, zuletzt von schnibli ()

  • (fast)Alles ist möglich.
    Der mMn einfachste Weg ist, wenn Du Dir aufschreibst, was Du vorhast,
    und dann den Satz auseinander nimmst als wäre es eine Sql-Anweisung.
    Hier wird es allerdings ein wenig speziell.


    Code
    1. Nun würe ich gerne alle Anlagen Nummern ausgeben -> SELECT `AnlageNr`
    2. bei der das aktuellste Einsatzdatum -> ORDER BY `Einsaetze` DESC
    3. im Jahre 2013 war -> WHERE `Einsaetze` BETWEEN '2013-01-01' AND '2013-12-31'
    4. und nicht in 2014 oder früher als 2013 vorkommt. -> HAVING `AnlageNr` NOT IN ~*gekürzt*(`Einsaetze` NOT BETWEEN '2013-01-01' AND '2013-12-31')





    Die Having Anweisung sorgt hier dafür, dass Du nur die `AnlageNr` bekommst,
    die wirklich nur in 2013 vorkommen.
    Existiert also eine `AnlageNr` auch in 2011, dann wird diese nicht ausgegeben.

  • Vielen dank für deine Erklärung ich habe jedoch ein Problem, und zwar:


    fehler wird mir leider keiner Ausgegeben.
    es wird aber auch nichts Angezeigt.
    Des Weiteren:
    Falls die AnlagenNr mit einem Datum vom Jahre 2014 existiert, soll diese auch nicht angezeigt werden
    (Auf gut deutsch ich brauche die AnlagenNr bei denen ein ServiceDatum von 2013 existiert und noch keines im Jahre 2014.)

  • Du musst einen Fehler bekommen.

    Zitat

    Parse error: syntax error, unexpected ')' in ...


    IM Bsp was Du gepostest hast -> Zeile 33 (Du hast die Klammer von der Query ausgeschlossen)


    Dass Du keinen Fehler bekommst, könnte daran liegen, dass Du 'display_errors', aber nicht 'error_reporting' aktiv hast.


    Versuch mal anstatt:
    ini_set('display_errors', true);
    das hier:
    ini_set('error_reporting', -1);
    ini_set('display_errors', -1);


    EDIT: das sind noch mehr Fehler.
    zB

    PHP
    1. echo"<table id="myTable" class="tablesorter" rules="all">";


    Zeile 42
    Kann gefixt werden durch

    PHP
    1. echo'<table id="myTable" class="tablesorter" rules="all">';


    EDIT2:
    und noch ein copy/paste -Fehler in der query (Zeile 32)
    sollte heißen:

    SQL
    1. `ServiceDatum` NOT BETWEEN '2013-01-01' AND '2013-12-31'

    Dieser Beitrag wurde bereits 1 Mal editiert, zuletzt von cottton ()

  • Habe die Abfrage angepasst:




    Danke für die Error aktivierung, wusste ich so nicht :)


    Ich bekomme folgenden Fehler:

    HTML
    1. Fatal error: Call to undefined method mysqli::error() in /volume1/web/anlagen/auszuf_service.inc.php on line 38


    Habe noch fehler wie AnlageNr --> AnlagenNr und " habe ich am schluss noch angefügt.


    Edit:
    Die klammer hatte ich auch vergessen habe sie noch nachgeführt (oben zeile 3)

    Dieser Beitrag wurde bereits 3 Mal editiert, zuletzt von schnibli ()

  • Es muss heißen: $mysqli->error
    (also keine Klammern)
    siehe: http://php.net/manual/de/mysqli.quickstart.statements.php


    Die Query stimmt wieder nicht =)
    So hier sollte es aussehen:

  • Hallo,
    Danke jetzt wird doch auch schon was Angezeigt.
    Jedoch hast du mich glaube ich falsch verstanden.
    Es sollen alle AnlagenNr von 2013 Angezeigt werden außer diejenigen die auch im 2014 erledigt wurden.
    Nun werden mir "glaube ich" alle Anlagen angezeigt die "Nur" in 2013 vorkamen auch wenn es früher als 2013 war :)


    P.S. die Klammern habe ich auch verschwinden lassen ;)



    Edit:
    Kann es sein das dies die Lösung ist xD


    Zeile 25

  • Zitat

    und nicht in 2014 oder früher als 2013 vorkommt.


    =)
    Momentan solltest Du bekommen:
    alles was BETWEEN '2013-01-01' AND '2013-12-31'
    und dessen `AnlagenNr` NICHT außerhalb diesen Bereiches liegt.


    Wenn aber jetzt


    BETWEEN '2013-01-01' AND '2013-12-31'
    UND darüber hinaus
    ABER NICHT darunter


    als Ergebnis kommen soll,
    dann sollte HAVING glaub ich so aussehen:


    In der Subquery bei HAVING sind also die "no go"´s drin

  • Nein falsch verstanden ;)


    alle Service die im Jahre 2013 erledigt wurden aber noch nicht im Jahre 2014 sollen angezeigt werden.


    Dies bringt mir doch die Lösung:

    SQL
    1. HAVING
    2. `AnlagenNr` NOT IN
    3. (
    4. SELECT
    5. `AnlagenNr`
    6. FROM
    7. `tblServiceDaten`
    8. WHERE
    9. `ServiceDatum` BETWEEN '2014-01-01' AND '2014-12-31'
    10. )


    Oder nicht?

  • Zitat

    Es sollen alle AnlagenNr von 2013 Angezeigt werden
    außer diejenigen die auch im 2014 erledigt wurden.


    alle Service die im Jahre 2013 erledigt wurden
    aber noch nicht im Jahre 2014 sollen angezeigt werden.


    oO?
    Entweder isses für mich zu spät oder ... :D


    Also sollen jetzt alle `AnlagenNr` angezeigt werden:
    alle die: `ServiceDatum` BETWEEN '2013-01-01' AND '2013-12-31'
    aber nicht: `ServiceDatum` BETWEEN '2014-01-01' AND '2014-12-31'


    Sollte als Ergebnis bringen:
    '2013-01-01' AND '2013-12-31'
    aber nicht vom Jahr 2014

    ... ich seh net mehr durch =)


    guck mal hier:


    Prinzip:


    EDIT: sory, copy paste Fehler:
    variante 3: muss heißen
    `ServiceDatum` > '2013-12-31'
    (NICHT '2013-01-01')

    Dieser Beitrag wurde bereits 1 Mal editiert, zuletzt von cottton ()

  • Hahaha es sollen alle Anlagen die den Service im Jahre 2013 hatten:

    SQL
    1. `ServiceDatum` BETWEEN '2013-01-01' AND '2013-12-31'


    aber noch nicht im Jahre 2014:

    SQL
    1. HAVING
    2. `AnlagenNr` NOT IN
    3. (
    4. SELECT
    5. `AnlagenNr`
    6. FROM
    7. `tblServiceDaten`
    8. WHERE
    9. `ServiceDatum` BETWEEN '2014-01-01' AND '2014-12-31'
    10. )


    sollen angezeigt werden.
    Ich glaube so stimmt es :) hab mal par checks durchgeführt und es scheint zu funzen :)


    noch ein kleines ding, kann ich die ausgabe auch gleich zählen und aufliesten :)? :?::!:

  • Glaub nicht.
    Das hieße doch jetzt:
    Grundauswahl von 2013
    aber
    filtere die aus, die in 2014 vorkommen
    SELECT 2013 HAVING *die auswahl* NOT IN 2014


    Wenn ich Dich jetz richtig verstanden hab wilst Du ja
    SELECT 2013 HAVING *die auswahl* NOT IN < 2013 (also 2014 zugelassen)


    wäre dann

    SQL
    1. HAVING `AnlagenNr` NOT IN
    2. (
    3. SELECT
    4. `AnlagenNr`
    5. FROM
    6. `tblServiceDaten`
    7. WHERE
    8. `ServiceDatum` < '2013-01-01'
    9. )


    EDIT:

    Zitat

    noch ein kleines ding, kann ich die ausgabe auch gleich zählen und aufliesten


    was auflisten und was zählen?

  • Anzahl der Aufgelisteten Datensätze....


    Ich Brauche dijenigen die in 2013 vorkommen aber nicht in 2014 deine Abfrage bringt mir aber jene die auch in 2014 vorkommen ich würde sagen das Trifft meine Abfrage
    Grundauswahl von 2013 aber nicht wenn zwischen 1.1.2014 -31.12.2014


    Kann ich diese Abfrage sinvoll weiterverarbeiten?
    Nun habe ich ja die Betreffende AnlagenNr..
    Auf einer 2 Tabelle ("tblAnlageAllgemein") währen noch die Anlagenbez.("bezeichnung") die ich Anhand der Anlagennummern("AnlagenNr") zuordnen könnte, nur wo muss ich das einfügen :)

    Dieser Beitrag wurde bereits 2 Mal editiert, zuletzt von schnibli ()

  • Eventuell (hab so langsam den Verdacht) rennen wir voll aneinander vorbei :D

    tabelle: tblServiceDaten

    Code
    1. AnlagenNr | ServiceDatum
    2. --------------------------
    3. 1 | 2010-06-06
    4. 1 | 2013-06-06
    5. 1 | 2013-07-06
    6. 1 | 2014-06-06


    mit der ersten Variante die ich Dir gegeben hatte hättest Du hier AnlagenNr 1 NICHT bekommen.
    Denn


    Bin ich da "zu weit gerannt"? :D

  • Ja ;)
    Den 06.06.2010 möchte ich nicht.
    Nur dijenigen die in 2013 vorkommen aber nicht in 2014
    Wenn einer in 2010 vorkommt aber nicht in 2014 möchte ich den nicht xD


    Die Abfrage Stimmt so wie ich sie oben gepostet habe, habe eine Kontrolle durchgeführt ;)


    Die Zählung der Eintrage habe ich auch realisiert:

    SQL
    1. $row_cnt = $erg->num_rows;
    2. printf("ES wurden %d Anlagen gefunden.\n", $row_cnt);


    Nun noch eines.


    Ich habe nun das Ergebniss:

    HTML
    1. 3511
    2. 5465
    3. 2135


    Ich Besitze nun eine 2 Tabelle (tabAnlagenNr)
    Auf dieser Tabelle habe ich eine Spalte ("AnlagenNr") die enthält auch

    HTML
    1. 3511
    2. 5465
    3. 2135.....


    zusätzlich enthält diese den Namen der Anlage ("ProjektBezeichnung")

    HTML
    1. Test1
    2. Test2
    3. Test3


    Also so:
    AnlagenNr // ProjektBezeichnung

    HTML
    1. 3511 // Test1
    2. 5465 // Test2
    3. 2135 // Test3


    Ist es nun möglich bei meiner abfrage dies so zu importieren das ich am schluss die AnlagenNr (wie bissher) und die Projektbezeichnung herauskriege? (Also eine Join Abfrage möchte ich noch einbinden :))


    Sows hier:

    SQL
    1. SELECT tblAnlagenNr.ProjektBezeichnung, tblServiceDaten.AnlagenNr
    2. FROM tblAnlagenNr
    3. LEFT JOIN tblServiceDaten
    4. ON tblAnlagenNr.AnlagenNr=tblServiceDaten.AnlagenNr
    5. ORDER BY tblAnlagenNr.ProjektBezeichnung

    Dieser Beitrag wurde bereits 6 Mal editiert, zuletzt von schnibli ()

  • Das ist dann der Einfache teil.
    Anstatt ON kann man USING nutzen, denn die Feldnamen haben den gleichen Namen.


    JOIN oder LEFT JOIN : wenn die AnlagenNr (der jeweilige Wert) immer in der 2ten Tabelle vorkommen muss,
    dann kannst Du JOIN verwenden.
    Die Tabelle heißt ja "tblAnlagenNr", daher denk ich ist das die Hauttabelle (wo die AnlagenNr her kommen).


    Mit JOIN bekommst Du immer nur einen Datensatz, wenn es die AnlagenNr auch in der Tabelle tblAnlagenNr gibt.
    Mit LEFT JOIN bekommst Du Daten der Tabelle tblServiceDaten auch dann, wenn es keine passende AnlagenNr in tblAnlagenNr gibt.



    BTW - wenn eine AnlagenNr in 2013 zB 3 mal vorkommt - willst Du dann alle 3 (Duplikate)? Oder nur einmal (denn es ist ja die gleiche - nur das Datum unterscheidet sich).
    Wenn Du die Duplikate möchtest, dann muss das GROUP BY `AnlagenNr` (Zeile 11) weg.