Kann ich gleichzeitig einen Wert ändern und auslesen (SQL)?

Ich möchte eine Tabelle erstellen in die verschiedene Werte eingetragen werden sollen. Darunter gibt es eine Spalte mit dem Namen "ID". Diese ID soll immer eins höher als die zuletzt hinzugefügte ID sein. Da IDs aber auch wieder gelöscht werden können, habe ich mir überlegt dass man ein Eintrag erstellt welcher die ID 0 besitzt

Die Tabelle besitzt noch eine zweite Zeile namens "Content". Wenn man jetzt einen neuen Eintrag macht, soll der Content des Eintrages mit der ID 0 um 1 erhöht werden, außerdem soll der neue Eintrag als ID den neuen wert des Contents bekommen:

Tabelle vorher

ID| Content

0 | 10


Tabelle nacher

ID| Content

0 | 11

11| "Ich mag Kekse"

Da dieser Code auch funktionieren soll, wenn viele Leute gleichzeitig neue Einträge erstellen, kommt das UPDATE von mySQL ganz gelegen:

UPDATE table_name SET content =content+1 WHERE ID=0

Hiermit wird schonmal verhindert, dass wenn zwei Leute gleichzeitig einen Eintrag erstellen, die ID nur um 1 erhöht wird.

Jetzt soll aber gleichzeitig der content bei ID=0 ausgelesen werden. Wenn man die anweisungen nacheinander ausliest kann es sein, dass benutzer 1 den wert bekommt der durch benutzer 2 entstanden ist (wenn sie gleichzeitig einen neuen Eintrag machen). (zumindest wenn man nach dem oben genannten code den Content mit SELECT ausließt.)

Wie kann man also mit MySQL in einer Zeile einen Wert ändern und gleichzeitig auslesen? in diesem Fall soll der Content bei ID=0 um eins erhöht werden und gleichzeitig soll der gleiche Content ausgelesen werden. (Dabei ist es egal ob man den Wert von vor der Addition oder den von danach bekommt, da man ja dann noch +1 rechnen kann :D )

SQL, programmieren, MySQL, PHP
MySQL select Abfrage mit spezieller Gruppierung

Hallo Leute,

ich stehe zur Zeit bei einer etwas (für mich) komplexen mySQL bzw. PHP Abfrage. Vielleicht könnt ihr mir einen Schubs in die richtige Richtung geben?!

Ich frage eine Tabelle mit verschiedenen Spalten ab, die auch verschiedene Werte beinhalten, die ich via AVG bzw. SUM berechne. Soweit so gut. In einer Spalte allerdings sind verschiedene Produktnamen die ich gruppieren will, allerdings gruppieren solange ein bestimmtes Zeichen im Produktnamen nicht erreicht ist.

Beispielabfrage:

SELECT COUNT(  `product` ) AS anzahl, AVG(  `aufwand` ) AS aufwand,  `product` FROM  `tabelle` WHERE 1 AND datum BETWEEN "$datumsvariable"  AND "$datumsvariable2'" AND `product` != "" AND  `product` !=  "\"\"" GROUP BY  `product`  ORDER BY  `aufwand`

Soweit so gut... Allerdings gibt es nun eben diese Produktnamen mit Klammern "(", die Details beinhalten die ich nicht als eigene Gruppe will. zB.

  • produktname AB
  • produktname CD
  • produktname CD (details bla bla)
  • produktname CD (details bla bla)
  • produktname AB
  • produktname AB (details bla bla)
  • produktname CD

Meine obige mySQL-Abfrage würde nun 4 Gruppen machen:

  • produktname AB
  • produktname AB (details bla bla)
  • produktname CD
  • produktname CD (details bla bla)

Ich will aber

  • produktname AB
  • produktname CD

Die produktname AB (details bla bla) und produktname CD (details bla bla) sollen enthalten sein in produktname AB bzw. produktname CD

Ich hoffe das war soweit verständlich und ihr könnt mir helfen.

Danke im Voraus, lg DeepX

SQL, programmieren, Datenbank, MySQL, PHP
Datenbank mit Variable aus Python füllen

Hallo,

Ich möchte meine Temperaturmessungen gerne in einer Datenbank speichern. Das ganze System läuft auf einem Raspberry Pi in Python. Wie ich an die Druck und Temperaturdaten hinkomme, weiss ich mittlerweile. Ich habe momentan nur das Problem das bei mir der import von den Zahlen in die Datenbank nicht klappt. Hiereinmal mein Code:

#!/usr/bin/env python
import MySQLdb
db = MySQLdb.connect("localhost", "monitor", "1234", "wetterstation")
curs=db.cursor()
temperature1 = 98    #Momentan meine Variablen, ist später werden dann natürlich die werte aus den Sensoren genommen.
pressure1 = 1001

try:
curs.execute ("INSERT INTO wetterdata values(CURRENT_DATE(), NOW(),  18.2, 18.3)")
db.commit()
print "Data committed"

except:
print "Error: the database is being rolled back"
db.rollback()

So klappt das auch ganz gut, aber sobald ich eben die 18.1 und 18.3 über eine Variable mir rausfische, komme ich zu dem Error.

curs.execute ("INSERT INTO wetterdata (date, time, temperature, pressure) VALUES (CURRENT_DATE(), NOW(), (?), (?))" , (temperature, pressure))

das klappt leider nicht.

So habe ich die Tabelle Created..

CREATE TABLE wetterdata (date DATE, time TIME, temperature NUMERIC, pressure NUMERIC);

Ich bekomme leider auf immer ein error wenn ich die (?) durch %s oder %f oder %d ersetze. Würde mich freuen wenn mir da jemand helfen kann oder mir jemand eine andere Möglichkeit vorzeigt wie man Variablen einfach in eine Datenbank im lokalen Netzwerk bekommt.

Danke, Justin

SQL, Datenbank, Python, Raspberry Pi
Oracle-PLSQL: Daten aus XML-Datei in die Datenbank einlesen - wie?

Hallo, ich habe ein Programm welches eine XML-Datei exportiert. Ich benötige diese XML, da sie zur "Weiterverarbeitung" zu einer Fremdfirma geschickt wird, die den Inhalt der Tags verändert ( die Tags selbst bleiben bestehen, also "ich weiß, was mich erwartet, wenn die XML eingelesen werden soll" ). Nunja. Den Export habe ich über DBMS-XMLGEN.getXML gelöst, das "Ergebnis" speichere ich einem CLOB und schreibe das File anschließend auf den Server. Um das Ding danach auf den Client zu holen habe ich in meiner Forms Anwendung eine Schleife, die über UTF-FILE jede Zeile einzeln von der Datei auf dem Server liest und diese Zeile dann über TEXT-IO auf dem Client in eine Datei schreibt. Jetzt ist wie gesagt das Problem, das Einlesen zu bewerkstelligen. Im moment ist es so, dass ich das File zwar einlesen kann, dann hab ich es wieder in einem CLOB, aber hilft mir ja nicht sonderlich viel, ich brauche ja den Inhalt der Tags um diesen Inhalt dann in den Feldern meiner Datenbank zu speichern.. Ich bin ziemlich am Verzweifeln. Also ich denke ganz ehrlich, den Stand wie er jetzt ist (also dass die XML-Datei auf dem Server gespeichert ist ) ist ok so, ich habe halt nur wirklich garkeine Idee wie ich den Inhalt der Tags rausbekommen kann. Ich habe schon viel gegooglet, aber leider noch nichts wirklich brauchbares gefunden, vielleicht kann mir ja hier jemand wenigstens ein Schlagwort für einen Lösungsansatz nennen?!

Ich habe eine Oracle 11g R1 Datenbank im Hintergrund, OS vom Server weiß ich leider nicht, nur dass es eine Linux-Kiste ist.

Computer, SQL, programmieren, Oracle
Mit Java Daten zu MySQL Datenbank hinzufügen

Ich habe ein Programm geschrieben, das Primzahlen errechnet. Ich würde diese nun auch gerne in einer MySQL Datenbank abspeichern, weiß aber nicht genau wie ich das anstellen soll (eigentlich habe ich überhaupt keine Ahnung :) ).

Hier das ursprüngliche Programm:

public class Primzahlen {
 public static void main (String[] args) {
  double d1;
  int[] p;
  p = new int[350000000];
  p[0] = 2;
  int a = 0;
  System.out.print("2, ");

  for(int Zahl = 3; Zahl < 2000000000; Zahl++) {

   for(int  b = 0; b < 2000000000; b++) {
    d1 = (double) Zahl/p[b];
    int i1 = (int) d1;
    //System.out.println(d1-i1 + "  Ergebnis " + Zahl+ "/" + p[b] + ": " + d1 + "  Zahl: " + Zahl + "  Divisor:  " + p[b] + "    " + p[0] + p[1] + p[2] + p[3]);

    if ((d1 - i1) == 0.0) {
     //System.out.println(Zahl + " ist keine Primzahl, sie ist durch " + p[b] + " teilbar.");
     break;
    } else {
     if((p[b]*p[b]) > Zahl) {
      System.out.print(Zahl + ", ");
      a++;
      p[a] = Zahl;
      break;

     }
    }
   } 
  }
 }
}

Und hier mein kläglicher Versuch die Zahlen in der Datenbank zu speichern:

import java.sql.Connection;
public class Primzahlen {
 public static void main (String[] args) {
  Connection con = DriverManager.getConnection("jdbc:mysql://localhost:4001?user=schueler&password=0");
  stmt = con.creatStatement();

  double d1;
  int[] p;
  p = new int[1000];
  p[0] = 2;
  int a = 0;
  System.out.print("2, ");

  for(int Zahl = 3; Zahl < 2000; Zahl++) {

   for(int  b = 0; b < 2000; b++) {
    d1 = (double) Zahl/p[b];
    int i1 = (int) d1;
    //System.out.println(d1-i1 + "  Ergebnis " + Zahl+ "/" + p[b] + ": " + d1 + "  Zahl: " + Zahl + "  Divisor:  " + p[b] + "    " + p[0] + p[1] + p[2] + p[3]);

    if ((d1 - i1) == 0.0) {
     //System.out.println(Zahl + " ist keine Primzahl, sie ist durch " + p[b] + " teilbar.");
     break;
    } else {
     if((p[b]*p[b]) > Zahl) {
      System.out.print(Zahl + ", ");
      a++;
      p[a] = Zahl;
      stmt.executeQuery(INSERT INTO schueler_primzahlen.primzahlen (Primzahl Nr. , Wert);
      VALUES (a, Zahl);


      break;

     }
    }
   } 
  }
 }
}

Ich wäre sehr froh, wenn jemand mich von den Qualen des "Herumprobierens" erlösen könnte.

Computer, Software, Mathematik, Programm, SQL, programmieren, Java, MySQL
Lotto Quoten - Warum dauert das immer so lange?

Hallo, liebe Community

Ich hab mich gestern durch den hohen Jackpot mal wieder dazu verleiten lassen, Lotto zu spielen und nachdem die Ziehung beendet war ist mir eine Frage gekommen, die ich mir schon öfter mal gestellt hab: Wieso dauert es immer so lange, bis die Quoten berechnet sind? Das zieht sich immer über Stunden hin, obwohl ein normaler Datenbankserver das normalerweise in wenigen Minuten oder sogar in weniger als einer Minute berechnen könnte.

Die gespielten Scheine werden ja von den Annahmestellen elektronisch an die Lottozentrale übertragen. Da muss es dann ja einen Datenbankserver geben, auf dem die aktuell gespielten Lose gespeichert werden. Da sich jetzt z.B. bei der Mittwochsziehung ein Spieleinsatz von 29.752.905,75€ zusammenaddiert hat und jede Spielvoraussage normalerweise 75 Cent kostet, geh ich mal von 39.670.541 Gewinnvoraussagen für die Mittwochsziehung aus. Diese Gewinnvoraussagen müssten zur leichteren Verarbeitung so in eine Tabelle geschrieben werden, dass pro getippter Zahl ein Datensatz entsteht. Wären dann also 238.023.246 Datensätze. Dann läuft für jede der 6 gezogenen Gewinnzahlen eine Abfrage, die die übereinstimmenden Zahlen markiert. Danach läuft noch eine, die ein Zusatzzahl-Flag setzt. Ich denk mal, dass das pro Abfrage weniger als 10 Sekunden dauert. Danach werden die Datensätze pro Spielvoraussage gruppiert und die markierten Zahlen gezählt. Das schätz ich auch mit einer Dauer von 10-20 Sekunden. Damit hätte man dann schon für jede Spielvoraussage die entsprechende Gewinnklasse ermittelt.

Die Berechnung des Geldbetrags, der pro Gewinnklasse zur Verfügung steht, ist auch schnell erledigt. Man nimmt den Gesamtspieleinsatz, zieht den Teil ab, der an die Annahmestellen, den Staat, Hilforganisationen, Lottozentrale etc. geht und teilt den Rest nach dem üblichen Schema in die entsprechenden Gewinnklassen auf. Da werden dann noch die Jackpots aus den früheren Spielen draufgerechnet. Die Beträge werden durch die Gewinnvoraussagen der jeweiligen Gewinnklassen geteilt und auf einen Cent abgerundet und schon weiß man, welche Gewinnvoraussage wieviel Geld wert ist. Die Berechnung dauert weniger als eine Sekunde.

Damit komm ich auf eine Berechnungszeit schätzungsweise zwischen einer und zehn Minuten. Also warum dauert es immer Stunden, bis die Quoten feststehen? Hab ich irgendwas elementares übersehen?

SQL, Datenbank, Lotto, Quote

Meistgelesene Beiträge zum Thema SQL