Frage

Sagen wir, ich brauche die Mitarbeiter eines Unternehmens abzufragen. Ich habe eine Tabelle, „Transaktionen“, die aus Daten für jede Transaktion enthält.

CREATE TABLE `transactions` (
  `transactionID` int(11) unsigned NOT NULL,
  `orderID` int(11) unsigned NOT NULL,
  `customerID` int(11) unsigned NOT NULL,
  `employeeID` int(11) unsigned NOT NULL, 
  `corporationID` int(11) unsigned NOT NULL,
  PRIMARY KEY (`transactionID`),
  KEY `orderID` (`orderID`),
  KEY `customerID` (`customerID`),
  KEY `employeeID` (`employeeID`),
  KEY `corporationID` (`corporationID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Es ist ziemlich einfach, diese Tabelle für Mitarbeiter abzufragen, aber es gibt einen Haken. Ein Transaktionsdatensatz einmal pro Mitarbeiter registriert ist, und so kann es für eine Korporation pro Auftrag mehrere Datensätze sein

Zum Beispiel, wenn Mitarbeiter A und B von der Körperschaft- 1 beide 2 einen Staubsauger an Korporation beteiligt waren, zu verkaufen, würde es zwei Datensätze in der „Transaktionen“ Tabelle sein; eine für jeden Mitarbeiter, und beide für Korporation 1. Dies muss die Ergebnisse nicht beeinflussen, though. Ein Handel von der Körperschaft- 1, unabhängig davon, wie viele seiner Mitarbeiter beteiligt waren, muß als solches behandelt werden.

Einfach, dachte ich. Ich mache nur eine Verknüpfung auf einer abgeleiteten Tabelle, etwa so:

SELECT corporationID FROM transactions JOIN (SELECT DISTINCT orderID FROM transactions WHERE corporationID = 1) AS foo USING (orderID)

Die Abfrage gibt eine Liste von Unternehmen, die in Geschäften mit Korporation beteiligt waren 1. Das ist genau das, was ich brauche, aber es ist sehr langsam, weil MySQL nicht den corporationID Index verwenden, um die abgeleitete Tabelle zu bestimmen. Ich verstehe, dass dies der Fall ist für alle Unterabfragen / abgeleitete Tabellen in MySQL.

Ich habe auch eine Sammlung von OrderIDs separat abzufragen versucht, und verwenden Sie eine lächerlich große IN () Klausel (typhically 100 000+ IDs), aber wie es aus MySQL wendet hat Probleme Indizes auf lächerlich großen IN () verwenden Klauseln gut und als Ergebnis der Abfragezeit nicht verbessern.

Gibt es noch andere Optionen zur Verfügung, oder habe ich erschöpft sie beide?

War es hilfreich?

Lösung

Wenn ich Ihre Anforderung verstehen, könnte man dies versuchen.

select distinct t1.corporationID
from transactions t1
where exists (
    select 1
    from transactions t2
    where t2.corporationID =  1
    and t2.orderID = t1.orderID)
and t1.corporationID != 1;

oder folgt aus:

select distinct t1.corporationID
from transactions t1
join transactions t2
on t2.orderID = t1.orderID
and t1.transactionID != t2.transactionID
where t2.corporationID = 1
and t1.corporationID != 1;

Andere Tipps

Ihre Daten machen mir keinen Sinn, ich glaube, Sie corporationID verwenden, wo Sie mittlerer Kunden-ID an einem gewissen Punkt in dort, wie Ihre Abfrage verknüpft die Transaktionstabelle in die Transaktionstabelle für corporationID = 1 basierend auf orderID die corporationIDs zu erhalten ... die dann 1 sein würde, nicht wahr?

Können Sie bitte angeben, was die customerID, employeeID und corporationIDs bedeuten? Wie kann ich weiß Mitarbeiter A und B von der Körperschaftssteuer ist 1 - in diesem Fall ist Korporation 1 die corporationID und Korporation 2 ist der Kunde, und so in der customerID gespeichert

Wenn das der Fall ist, brauchen Sie nur eine Gruppe zu tun, indem Sie:

SELECT customerID
FROM transactions
WHERE corporationID = 1
GROUP BY customerID

(Oder wählen und Gruppe von orderID, wenn Sie pro Bestellung eine Zeile wollen, anstatt eine Zeile pro Kunde).

Durch die Gruppe unter Verwendung von, ignorieren Sie die Tatsache, dass es mehrere Datensätze, die mit Ausnahme der employeeID Duplikat sind.

Im Gegensatz zu Rückkehr alle Unternehmen, die körperschaft 2 verkauft haben.

SELECT corporationID
FROM transactions
WHERE customerID = 2
GROUP BY corporationID
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top