2017-11-07 2 views
0

Ich habe eine MySQL-Abfrage mit der Unterabfrage.
SQL fiddleMysql Unterabfrage Optimierung mit Gruppe von

Die Tabellenstruktur ist:

CREATE TABLE `wildberries` (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `brand` VARCHAR(50) NULL DEFAULT NULL, 
    `subject` VARCHAR(50) NULL DEFAULT NULL, 
    `article` VARCHAR(50) NULL DEFAULT NULL, 
    `size` VARCHAR(50) NULL DEFAULT NULL, 
    `color` VARCHAR(50) NULL DEFAULT NULL, 
    `income` INT(11) NULL DEFAULT NULL, 
    `income_sum_price` VARCHAR(50) NULL DEFAULT NULL, 
    `ordered` VARCHAR(50) NULL DEFAULT NULL, 
    `ordered_sum_price` VARCHAR(50) NULL DEFAULT NULL, 
    `ordered_max_by_day` VARCHAR(50) NULL DEFAULT NULL, 
    `return_before_payment` VARCHAR(50) NULL DEFAULT NULL, 
    `return_before_payment_sum_price` VARCHAR(50) NULL DEFAULT NULL, 
    `sales_by_payment` INT(11) NULL DEFAULT NULL, 
    `sales_by_payment_sum_price` VARCHAR(50) NULL DEFAULT NULL, 
    `return` INT(11) NULL DEFAULT NULL, 
    `return_sum_price` VARCHAR(50) NULL DEFAULT NULL, 
    `stock` VARCHAR(50) NULL DEFAULT NULL, 
    `source_file` VARCHAR(50) NULL DEFAULT NULL, 
    `from` DATE NULL DEFAULT NULL, 
    `end` DATE NULL DEFAULT NULL, 
    `clear_article` VARCHAR(50) NULL DEFAULT NULL, 
    `user_id` INT(11) NULL DEFAULT NULL, 
    `file_hash` VARCHAR(50) NULL DEFAULT 'sha1(concat(user_id, source_file))', 
    PRIMARY KEY (`id`), 
    INDEX `from` (`from`), 
    INDEX `end` (`end`), 
    INDEX `size_color_clear_article` (`size`, `color`, `clear_article`) 
) 
COLLATE='utf8_general_ci' 
ENGINE=InnoDB; 

Frage ist:

SELECT wildberries.clear_article AS clear_article, wildberries.color AS color, wildberries.size AS size, (
SELECT w2.stock 
FROM wildberries w2 
WHERE w2.clear_article = wildberries.clear_article AND w2.color = wildberries.color AND w2.size = wildberries.size 
ORDER BY w2.from DESC 
LIMIT 1) AS stock 
FROM wildberries 
GROUP BY clear_article , color, size 
ORDER BY `from` DESC 

Diese Abfrage gibt mir den richtigen Wert (Lager für das neueste Produkt Datum).

Aber diese Abfrage ist zu langsam. Ich habe versucht, Indizes hinzuzufügen - keine Ergebnisse.

Die Hauptidee ist: für jedes Produkt (Kombination mit clear_article, Größe und Farbe) erhalten neueste 'von' und bekommen 'Lager' für sie.

Kann mir jemand Rat geben - ist es möglich, diese Abfrage ohne die Unterabfrage neu zu schreiben?

Aktualisiert: Beispieldaten sind auf dem Tisch.

+0

nicht Link olny verwenden .. auch mit Probe und erwarteten Ergebnis fügen Sie Text – scaisEdge

+1

es keine Daten gibt, so würde ich nicht viel von einem Ergebnis erwarten :-(Und es gibt wirklich keinen Grund, irrelevante Spalten in der Beispieltabellenstruktur einzuschließen. – Strawberry

+0

Warum die Unterabfrage auswählen? – abr

Antwort

0

Warum die Subselect zu der gleichen Tabelle, wenn Sie den Wert abrufen, der bereits an erster Stelle ist? Eine vereinfachte Version von dem, was du hast

SELECT clear_article, color, size, stock 
FROM wildberries 
ORDER BY wildberries.from DESC 
+0

Entschuldigung, ich habe einen großen Fehler in der Abfrage gemacht. Ich habe vergessen, GROUP BY-Bedingung hinzuzufügen. Es ändert sich alles. – Tasty

+0

Und wenn Ihre Anfrage wir hinzufügen GROUP BY Bedingung, Ergebnis in Lager wird nicht korrekt sein PS Sorry für die falsche Frage – Tasty

+0

Geben Sie eine Antwort und schließen Sie diese Frage, für zukünftige Referenz :) – abr

Verwandte Themen