• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

SQL-Anfänger-Frage

Denny5

New member
Hallo,

ich habe folgendes Problem.
Ich habe 3 Tabellen:
tabelle_a enthält alle Kunden mit Kundennummer etc. (geschlossener Kundenkreis)

tabelle_b enthält die Bestellung(en) der Kunden aus Geschäftsbereich A also Kundennummer, Artikelnummer

tabelle_c enthält die Bestellung(en) der Kunden aus Geschäftsbereich B also Kundennummer, Artikelnummer

Ich möchte nun eine SQL-Abfrage basteln die mir die Anzahl der Kunden zurück gibt, die mind. eine Bestellung - egal ob tabelle_b (Geschäftsbereich A) oder tabelle_c (Geschäftsbereich B) - geordert haben.

Das folgende SQL-Statement funktioniert zwar, ist aber wahrscheinlich dennoch sehr schlecht gemacht. Das geht doch bestimmt viel einfacher und schneller, oder?
Diese Abfrage liefert mir zwar wie gesagt das gewünschte Resultat, aber wenn ich ein paar hundert Bestellungen in der Tabelle habe dauert die SQL-Abfrage ziemlich lange.

Code:
$sql = SELECT
    COUNT(DISTINCT(tabelle_a.kundennummer))
FROM tabelle_a, tabelle_b, tabelle_c
WHERE
    (tabelle_a.kundennummer=tabelle_b.kundennummer)
OR
    (tabelle_a.kundennummer=tabelle_c.kundennummer);

$result = mysql_query($sql) or die($error_msg.sql_error($sql,__LINE__));
$anz = mysql_result($result,0);

Vielen Dank schon mal
Denny
 
Unterscheiden sich den die Daten der Bestellungen aus den beiden Geschäftsbereichen wesentlich? Weil sonst gehören die Bestellungen in die selbe Tabelle (nen Flag zur Unterscheidung müßte dann halt noch dazu).

Hast du einen Index auf der Kundennummer in allen 3 Tabellen? Wenn nicht, anlegen, sollte deine Abfrage um einiges beschleunigen.
Warum du allerdings tabelle_a noch in die Abfrage mit einbeziehst, versteh ich nicht. Kunden die in b und c auftauchen stehen doch auch in a oder nicht? Und wenn du nur die Anzahl der Kundennummern brauchst, ist der Join mit Tabelle a überflüssig.
Probier doch mal folgendes:

Code:
SELECT COUNT(DISTINCT (kundennummer)) FROM
   (SELECT kundennummer FROM tab_b
   UNION
   SELECT kundennummer FROM tab_c)

eventuell bringt es noch etwas wenn du das DISTINCT mit in die Subquery mit reinziehst.
 
Vielen Dank für die Antwort!

Warum du allerdings tabelle_a noch in die Abfrage mit einbeziehst, versteh ich nicht

Ja, das versteh ich jetzt, nachdem ich deinen Vorschlag gesehen habe, auch nicht mehr :D

Ich habe die Indexe angelegt und deinen Vorschlag verwendet. Ich musste lediglich hinter dem Sub-SELECT noch ein "as tmp" einfügen. Sonst bekam ich den Fehler: "1248 Every derived table must have its own alias" .

Jetzt dauert die Abfrage nicht mehr ca. 7 Sekunden sondern 0,0014 Sekunden.

Vielen, vielen Dank

Denny
 
Jedoch solltest du dir überlegen ob es wirklich klug und logisch ist, die Daten der Bestellungen in den Geschäftsbereichen auf 2 Tabellen aufzuteilen.
 
Zurück
Oben