www.mikrocontroller.net

Forum: PC-Programmierung MySQL - Abfrage mit Fehler


Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi zusammen!

Ich habe da mal ein etwas aussergewöhnlicheres Problem:
In meiner MySQL-DB gibt es zwei Tabellen, eine mit Artikeln und eine mit 
Testergebnissen. Ein Artikel hat eine Seriennummer und diese kann nur 
ein einziges mal in der Tabelle Artikel vorhanden sein. In der Tabelle 
mit den Testergebnissen gibt es zu jeder Seriennummer mindestens einen 
Test, es können aber auch mehrere vorhanden sein. Damit sind in "test" 
Seriennummern mehrfach vorhanden. Ein kurzer Überblick:
Tabelle "test":
+-------+------------+---------------------+
| ID    | SN         | Datum               |
+-------+------------+---------------------+
| 1     | 1234567890 | 2007-10-18 08:41:48 |
+-------+------------+---------------------+

Tabelle "artikel":
+------------+-----+-----+
| SN         | SNr | KNr |
+------------+-----+-----+
| 1234567890 |   4 |   1 |
+------------+-----+-----+

Ich möchte jetzt alle Artikel, die in einem bestimmten Zeitraum 
(test.Datum) getestet wurden, zählen lassen (wohlgemerkt: die Menge der 
Artikel ist gefragt, nicht die Menge der Tests!):
SELECT count(a.SN) Menge
FROM artikel a, test t
WHERE t.SN = a.SN &&
      t.Datum >= '2007-10-17 08:15:00' &&
      t.Datum <= '2007-10-19 00:00:00'
;
Ich bekomme jetzt aber leider immer die Anzahl der durchgeführten Tests, 
nicht die Anzahl der Artikel, die getestet wurden.
Steh ich auf dem Schlauch?
Kann mir da jemand weiterhelfen?

Autor: Peter P. (bonsaibaum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
select count(distinct(a.SN)) .....

dann kommt jede sernr nur 1 mal vor... andernfalls bekommst du für jeden 
test eine zeile .... da wird dann nat. zu viel gezählt.

lg
    peter

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, Peter, das war's!
Ich hatte mir schon etwas in der Richtung gedacht, aber darauf wäre ich 
nicht gekommen. Ich war zwischenzeitlich bei drei Subqueries. Das hat 
mich dann dazu veranlasst, doch mal im Forum zu fragen ;-)

Autor: Peter P. (bonsaibaum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dafür sind wir ja da ;)

PS:  sei froh dasst des net in Oracle machst gg

lg
    Peter

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Subqueries der Form
select count(*) from artikel a where exists (
    select * from test t
    where t.SN = a.SN &&
         t.Datum >= '2007-10-17 08:15:00' &&
         t.Datum <= '2007-10-19 00:00:00'
)

(geht übrigens wunderbar mit einer, wie kommst du auf drei?) werden von 
einigen DB-Engines (Oracle, Microsoft) aber besser optimiert. Bei MySQL 
weiß ich nicht, wie es das macht, von daher würde ich an deiner Stelle 
mal beide Lösungen mittels Profiler vergleichen.

Bei der obigen Lösung kann es dir im ungünstigsten Fall passieren, daß 
die DB erst einen vollständigen INNER JOIN durchführt, d.h. für jeden 
Test eine Zeile liefert, und dann erst mit DISTINCT nach Duplikaten 
sucht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.