MySQL - Abfrage mit Fehler

OP Persönliche Seite #679008
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:
1
Tabelle "test":
2
+-------+------------+---------------------+
3
| ID    | SN         | Datum               |
4
+-------+------------+---------------------+
5
| 1     | 1234567890 | 2007-10-18 08:41:48 |
6
+-------+------------+---------------------+
7

8
Tabelle "artikel":
9
+------------+-----+-----+
10
| SN         | SNr | KNr |
11
+------------+-----+-----+
12
| 1234567890 |   4 |   1 |
13
+------------+-----+-----+

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!):
1
SELECT count(a.SN) Menge
2
FROM artikel a, test t
3
WHERE t.SN = a.SN &&
4
      t.Datum >= '2007-10-17 08:15:00' &&
5
      t.Datum <= '2007-10-19 00:00:00'
6
;
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?
Gast
Subqueries der Form
1
select count(*) from artikel a where exists (
2
    select * from test t
3
    where t.SN = a.SN &&
4
         t.Datum >= '2007-10-17 08:15:00' &&
5
         t.Datum <= '2007-10-19 00:00:00'
6
)

(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

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.