Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL fragt mehrere Tabellen ab

Okay, während ich teilweise zustimme, dass Sie etwas herumstöbern und mehr über Left Joins lernen sollten, gibt es auch einige Kniffe bei der korrekten Beantwortung dieser Frage, die einem Anfänger möglicherweise entgehen. Ich werde weitermachen und Ihnen bei der Beantwortung helfen, aber ich würde empfehlen, mehr über Verknüpfungen zu erfahren.

Meine genaue Abfrage würde von den verfügbaren Indizes abhängen, aber sie sieht sehr wahrscheinlich so aus:

SELECT a.* 
FROM products AS a
LEFT JOIN (
SELECT product_id FROM order_products as b 
INNER JOIN orders AS c
ON b.order_id = c.order_id
WHERE c.date_ordered >= date_sub(c.date_ordered, INTERVAL 7 day)
GROUP BY product_id 
) AS d
ON a.product_id = d.product_id 
WHERE d.product_id IS NULL

Ich schreibe eine Unterabfrage, die Bestellungen zusammenfügt und Produkte bestellt, wobei date_ordered in einen bestimmten Datumsbereich fällt (ich würde empfehlen, hier etwas über die Funktion date_sub zu lernen:http://www.w3schools.com/sql/func_date_sub.asp und machen Sie auch ein paar schnelle SELECT date_sub(date_ordered, INTERVAL X DAY) FROM Orders-Abfragen, um sicherzustellen, dass Sie verstehen, wie diese Berechnung in der Praxis funktioniert.

Jetzt erhalte ich meine Liste der Bestellungen für die letzten X Tage (7 in der obigen Abfrage) und verbinde sie mit der Produkttabelle der Bestellungen, um die bestellten Produkte zu erhalten. Hier möchte ich im Grunde meine Produkte deduplizieren. Product_id =300 wurde möglicherweise 70 Mal bestellt. Product_id =200 wurde möglicherweise 50 Mal bestellt. Was auch immer der Fall sein mag, ich möchte nicht 70 Datensätze und 50 Datensätze zu meiner Produkttabelle für die Produkt-IDs 300 und 200 hinzufügen, also habe ich sie dedupliziert. Das macht die letzte GROUP BY-Anweisung. Es ist funktional dasselbe wie das Schreiben von DISTINCT (obwohl es unter bestimmten Umständen geringfügige Unterschiede in der Berechnung geben kann, scheint keiner dieser Umstände hier zuzutreffen ... verwenden Sie DISTINCT, wenn das für Sie klarer ist)

Sobald ich meine Liste mit eindeutigen Produkt-IDs habe, die in den letzten X Tagen bestellt wurden, verbinde ich diese mit meiner Produkttabelle. Hier verwende ich einen linken Join. Wie in den oben erwähnten Kommentaren sollten Sie sich den Begriff der Verknüpfungen ziemlich genau ansehen. Tun Sie das, falls Sie es noch nicht getan haben.

Zuletzt wende ich einen WHERE-Filter an, der besagt:„WHERE d.product_id IS NULL“. Was dies tut, ist zu sagen:„Okay, wenn product_id =Y in den letzten X Tagen bestellt wurde, wird es erfolgreich mit a.product_id =d.product_id zu meiner Produkttabelle hinzugefügt. Wenn es nicht bestellt wurde, dann a. product_id wird in meiner Ergebnismenge vorhanden sein, aber d.product_id nicht. Das heißt, d.product_id wird null sein."

Diese letzte Wendung kann der Teil sein, der nicht offensichtlich ist / auffällt.

Hoffe das hilft.