Ankündigung

Einklappen
Keine Ankündigung bisher.

kleinste ID abfragen bzw. Frage nach mysql-lösung

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • kleinste ID abfragen bzw. Frage nach mysql-lösung

    Hallo,

    ich habe eine Tabelle mit fische, zu dieser Tabelle nutze ich eine weitere Tabelle images, in der images gibt es die Felder imageId (Auto-increment), fischeId beschreibung, zusatzInfo, etc.

    Die Bilder selbst speichere ich auf dem Server im Dateisystem ab.
    ich generiere nur aus einer Kombination von fischeId und imageId den Dateinamen des Bildes.

    Ich möchte nun eine Tabelle füllen mit den Informationen zu fische und dem ERSTEN Bild aus images was zu fische gehört.
    Grund: in images kann es ja viele Bilder mit der gleichen fischeId geben.
    Ich möchte nun das erste angelegte Bild von fischeID erhalten.

    Jetzt dachte ich mir ob es eine Möglichkeit gibt eine Abfrage zu erstellen in der ich die kleinste imageId die ich mit
    Select * FROM images WHERE fischeId=1
    erhalte.

    Wenn ich gleich dabei bin. Hier noch eine Frage.

    In einer anderen Tabelle "informationen" benötige ich zwei Datumsfelder (erstellDatum, aenderungsDatum).
    Ich dachte an einen Feld-Typ TimeStamp beim Erstelldatum mit CURRENT_TIMESTAMP als DEFAULT. Mit dem Feld-Typ DATETIME geht das glaube ich nicht oder?

    Das es wie oben bei fische und images ist, kann die Tabelle "informationen" mehrere Datensätze zu einem fisch haben. Wenn ich die Web-Seite und dort die Tabelle (Infos zu Fischen) später mit php füllen werde möchte ich nur den fisch haben und immer nur das erste Bild und die letzte aktuellste Information.

    Dazu muss ich dann in der Tabelle "informationen" nach dem jüngsten Datum suchen und in der Tabelle images nach der kleinsten imageID die noch dazu im Datenfeld fischeId die gleiche fischeId besitzt..

    Hoffe meine Beschreibung und Fragestellung war/ ist nicht zu verwirrend

    Kann man das so machen?
    wenn ja wie sollte ich die datenfelder (Datum) in der Tabelle "informationen" formatieren und wie sollte die Abfrage später aussehen?

    Sorry für die vielen Fragen.

    Grüße Jürgen

  • #2
    Du hast irgendwie eine "blumige" Art zu schreiben

    Jetzt dachte ich mir ob es eine Möglichkeit gibt eine Abfrage zu erstellen in der ich die kleinste imageId die ich mit Select * FROM images WHERE fischeId=1 erhalte.
    So?

    Code:
    SELECT name, beschreibung, dateiname, whatever 
    FROM   fische_bilder 
    WHERE  fisch_id = 1 
    ORDER  BY bild_erstellt DESC 
    LIMIT  1
    SELECT * besser durch die Spalten ersetzen die du wirklich abholst. http://php-de.github.io/jumpto/code-smells/#select-

    In einer anderen Tabelle "informationen" benötige ich zwei Datumsfelder (erstellDatum, aenderungsDatum).
    Ich dachte an einen Feld-Typ TimeStamp beim Erstelldatum mit CURRENT_TIMESTAMP als DEFAULT. Mit dem Feld-Typ DATETIME geht das glaube ich nicht oder?
    Schau mal hierzu:

    Zuerst das: http://www.scandio.de/2011/02/der-un...atetime-mysql/

    Dann das: http://stackoverflow.com/a/4897134

    LG
    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      Zitat von hausl Beitrag anzeigen
      Du hast irgendwie eine "blumige" Art zu schreiben


      Schau mal hierzu:

      Zuerst das: http://www.scandio.de/2011/02/der-un...atetime-mysql/

      Dann das: http://stackoverflow.com/a/4897134

      LG
      Hallo,

      vielen Dank für die Infos
      das werde ich mir gleich mal ansehen.

      die abfrage
      ORDER BY bild_erstellt DESC
      LIMIT 1
      ist wohl genau das was ich benötige

      Danke

      Frage:
      Ich habe ja zwei Datumsfelder (DateTime oder Timestamp)
      Wenn ich möchte das automatisch beim erstellen eines Datensatzes das Datumsfeld beschrieben wird (ohne mein Zutun) kann ich dann als Defalt-Wert CURRENT_Timestamp verwenden bzw. ist dies dann sinnvoll?

      ich frage deshalb.
      Wenn ich später den Datensatz ändere dann wollte ich das im zweiten Datumsfeld (erstellDatum, aenderungsDatum) auch der aktuelle Datumswert gesetzt wird, jedoch im Feld erstellDatum dies unberührt bleibt.

      Ich vermute fast dann kann ich CURRENT_TIMESTAMP gar nicht verwenden oder?

      Grüße Jürgen

      Kommentar


      • #4
        Zitat von selfmade01 Beitrag anzeigen

        die abfrage
        ORDER BY bild_erstellt DESC
        LIMIT 1
        ist wohl genau das was ich benötige
        Ich schenke Dir ein min().

        Danke
        Bitte.

        Frage:
        Ich habe ja zwei Datumsfelder (DateTime oder Timestamp)
        Wenn ich möchte das automatisch beim erstellen eines Datensatzes das Datumsfeld beschrieben wird (ohne mein Zutun) kann ich dann als Defalt-Wert CURRENT_Timestamp verwenden bzw. ist dies dann sinnvoll?

        ich frage deshalb.
        Wenn ich später den Datensatz ändere dann wollte ich das im zweiten Datumsfeld (erstellDatum, aenderungsDatum) auch der aktuelle Datumswert gesetzt wird, jedoch im Feld erstellDatum dies unberührt bleibt.

        TRIGGER gibt es sogar bei MySQL. Mittlerweile.
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Das wird in der Doku sehr ausführlich beschrieben:

          http://dev.mysql.com/doc/refman/5.0/...alization.html

          Allerdings nur für Timestamp, einen Trigger für datetime findest du in den comments.
          [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

          Kommentar


          • #6
            Wobei er ab MySQL 5.6.5. auch mehr TIMESTAMP-Felder mit default / on update .. verwenden könnte, und sich somit die Trigger sparen.

            http://dev.mysql.com/doc/relnotes/my...ews-5-6-5.html

            Previously, at most one TIMESTAMP column per table could be automatically initialized or updated to the current date and time. This restriction has been lifted. Any TIMESTAMP column definition can have any combination of DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP clauses.
            LG
            The string "()()" is not palindrom but the String "())(" is.

            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
            PHP.de Wissenssammlung | Kein Support per PN

            Kommentar


            • #7
              Zitat von hausl Beitrag anzeigen
              Wobei er ab MySQL 5.6.5. auch mehr TIMESTAMP-Felder mit default / on update .. verwenden könnte, und sich somit die Trigger sparen.

              http://dev.mysql.com/doc/relnotes/my...ews-5-6-5.html



              LG
              Hallo,
              ich hatte hier schonmal eine Info erhalten die sehr nützlich war da ich zwei Tabellen und dort die Datumsfelder automatisch bei Änderung updaten musste.
              Dazu wurde mir ein Trigger-Befehl mitgeteilt der das nun erledigt.
              Grund war jedoch der, dass nur eine Tabelle und deren Felder vom User geändert wird und deshalb auch eine abhängige zweite Tabelle und dort das Datum mit geändert werden sollte.

              Hier geht es nur um eine Tabelle und deren Datumsfelder wobei ich aktuell zwei davon habe erstellDatum und aenderungsDatum.
              Wobei das erstelldatum nur einmal beschrieben werden soll und sonst nicht mehr geändert wird.
              Und da glaube ich das wenn ich das Feld mit timestamp und CURRENT_TIMESTAMP formatiere das nicht geht da es dann ja jedesmal geändert werden würde wenn ein User die anderen Felder darin ändert oder?

              Das zweite Feld soll stets dann geändert werden wenn es Änderungen im Datensatz gleich an welcher Stelle gibt

              Mysql wird in der aktuellen Version verwendet!

              Was wäre dann hier die beste Variante?

              Grüße Jürgen

              Ps. Den Link zum Unterschiede zw. Timestamp und Datetime habe ich gelesen. Eine 100%'ige Eindeutigkeit des Datumsstempels würde ich nicht zwingend benötigen da bei mir keine zwei User gleichzeitig Änderungen vornehmen.

              so wie ich das nun flüchtig in der verlinkten Doku lesen konnte könnte ich beim erstellDatum DEFAULT CURRENT_TIMESTAMP und beom aenderungsdatum UPDATE CURRENT_TIMESTAMP verwenden oder?

              Kommentar


              • #8
                Muss nochmal stören

                ich habe hier die Version 5.5.35-0

                eine Spalte habe ich nun mit CURRENT_TIMESTAMP belegt die zweite wollte ich nun mit on UPDATE belegen was nicht geht.
                ich vermute schlimmes

                MySQL versions before 5.6.1 would not let two TIMESTAMP columns in the same table, unless as you rightly noted with out defaults and allowing null.

                ist das so?

                wenn ja muss ich wohl meine mysqldb updaten...

                gibts dazu einen link wie ich meine Konfiguration, meine ganzen Tabellen und Zugriffsrechte auf einmal sichern und wieder zurückspielen kann?

                Grüße Jürgen

                Kommentar


                • #9
                  Zitat von selfmade01 Beitrag anzeigen

                  MySQL versions before 5.6.1 would not let two TIMESTAMP columns in the same table, unless as you rightly noted with out defaults and allowing null.

                  ist das so?
                  Vermutlich. MySQL ist einfach nur eine Sammlung für Dinge, die nicht funktionieren.

                  Probier selber:

                  Code:
                  create table selfmade01(i int check (i < 10));
                  Das wird funktionieren. Funktionieren wird auch:

                  Code:
                  insert into selfmade01 values (11);
                  Und nun denk nach: ist 11 größer 10? Sollte der Insert funktionieren? Oder sollte eher sowas wie hier passieren?

                  Code:
                  test=*# create table selfmade01(i int check (i < 10));
                  CREATE TABLE
                  Time: 66,238 ms
                  test=*# insert into selfmade01 values (11);
                  ERROR:  new row for relation "selfmade01" violates check constraint "selfmade01_i_check"
                  DETAIL:  Failing row contains (11).
                  Time: 0,347 ms
                  PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                  Kommentar


                  • #10
                    Hallo,
                    was willst Du mir damit sagen? das mysql doof ist?

                    Kommentar


                    • #11
                      Zitat von selfmade01 Beitrag anzeigen
                      Hallo,
                      was willst Du mir damit sagen? das mysql doof ist?
                      Unter anderem. Aber nicht nur.
                      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                      Kommentar


                      • #12
                        Hi..

                        lach
                        ok.. passt schon... wenn ich wieder ein DB aufsetze weiss ich zumindest ein paar Dinge mehr auf die ich achten muss und weiss dann evtl. welche für mich geeigneter wäre.
                        Aktuell bin ich mit mysql hier zu arg verstrickt und mehr an meinem admin-tool beschäftigt.

                        Werde aber dann als erstes unter php auf PDO umsteigen und dann evtl. mal ein anders DB-System testen

                        Aktuell habe ich nun auf Version 5.5 upgedatet. Ich habe halt nur ein Raspberry da, deswegen habe ich diese variante gewählt... geht fix mit apt-get
                        Hätte aber eh besser 5.6 gebraucht da ich zwei timestamps in einer Tabelle verwenden wollte

                        egal.
                        ich habs jetzt mit einem Datetime was einen Trigger dahinter hat der das Datum setzt wenn neu angelegt
                        und das Änderungsdatum hat den timestamp bekommen mit dem Default ON Update Current_TImestamp

                        Ich hoffe ich habe da nix verpfuscht

                        Grüße Jürgen

                        Kommentar


                        • #13
                          Zitat von selfmade01 Beitrag anzeigen
                          Werde aber dann als erstes unter php auf PDO umsteigen und dann evtl. mal ein anders DB-System testen
                          Du wirst das schon schaffen !!1elf.

                          Ein Raspberry ist mittlerweile auch in der Build-Farm von PostgreSQL. Aber egal: lerne erst einmal schmerzhaft die Nachteile eines kapotten Systems lernen, umso mehr macht dann ein richtiges Spaß.
                          PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                          Kommentar


                          • #14
                            Zitat von akretschmer Beitrag anzeigen
                            Du wirst das schon schaffen !!1elf.

                            Ein Raspberry ist mittlerweile auch in der Build-Farm von PostgreSQL. Aber egal: lerne erst einmal schmerzhaft die Nachteile eines kapotten Systems lernen, umso mehr macht dann ein richtiges Spaß.
                            ich brauche später einen gut funktionierenden connector zu einem arduino.
                            Mein System was ich hier bastle basiert auf rapberry(webserver-db-mail etc) und einem arduino der dann die Daten von der db auf dem Raspberry bekommt und dort hin weider schreibt.

                            Der Connector wird den Entscheid bringen wie fix ich auf postgrees umstellen oder umstellen muss. der mysql-connector geht zwar ist aber glaube ich nicht ganz einfach

                            PDO wollte ich eh noch umstellen. dann kann ich eh zw. mysql und pg wechseln. Aktuell geht es noch so mit dem mysql... das mit den timestamps ärgert halt schon, geht aber noch.

                            Grüße Jürgen

                            Kommentar


                            • #15
                              Hallo,
                              muss nochmal nachfragen.

                              wie ich einen Datensatz nach Datum sortiere und die Ausgabe dann auf einen Datensatz beschränke habe hier erfahren.
                              Danke nochmals.

                              Nun möchte ich jedoch jeden Datensatz aus "becken" und von den Infos die zu becken gehören, bzw. die Tabellen die ich in meinem inner join abfrage, von denen möchte ich nur je einen Datensatz erhalten der an eine bestimmte Bedingung geknüpft ist

                              Frage.
                              Kann ich hier den inner Join einfach mit order by und limit erweitern oder muss ich dann im inner join einen extra Select in () ausführen in dem dann diese order by und limit Anweisung enthalten ist.

                              Beispiele im Netz zeigten nur letztere Möglichkeit.

                              Hioer mal der mysql-string

                              Code:
                              SELECT 
                              											becken.beckenId,
                              											becken.beckenName,
                              											becken.startSatz,
                              											becken.endSatz,
                              											becken.imageId AS beckenimageId,
                              											becken.zuchtTypId,
                              											becken.active,
                              											becken.beckenStars,
                              											beckenInfo.name,
                              											beckenInfo.zuechter,
                              											zuchtTyp.zuchtTyp,
                              											images.imageId AS imagesimageId,
                              											images.imageForm,
                              											images.imageTitle,
                              											information.information,
                              											information.informationTitle,
                              											information.createDateTime,
                              											information.changeDateTime
                              											
                              											FROM becken 
                              											LEFT JOIN  beckenInfo ON beckenInfo.beckenInfoId 		= becken.beckenInfoId		
                              											LEFT JOIN  zuchtTyp ON becken.zuchtTypId 			= zuchtTyp.zuchtTypId	
                              											LEFT JOIN  images ON becken.beckenId 			= images.beckenId	
                              											LEFT JOIN  information ON becken.beckenId 	= information.beckenId												
                              											ORDER BY $sidx $sord LIMIT $start , $limit");
                              Die Anweisung ORDER BY und LIMIT (ORDER BY $sidx $sord LIMIT $start , $limit") die sich ja auf becken bezieht, wird bei mir nur für eine jqgrid Tabelle genutzt da ich dort filtern und die Datensätze begrenzen kann die angezeigt werden!

                              Viele Grüße Jürgen

                              Kommentar

                              Lädt...
                              X