Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL wysyła zapytania do wielu tabel

Okej, więc chociaż częściowo zgadzam się, że powinieneś trochę poszperać i dowiedzieć się więcej o lewych łączeniach, istnieje również pewna trudność w prawidłowej odpowiedzi na to pytanie, która może zostać zgubiona u początkującego. Pomogę Ci odpowiedzieć, ale polecam dowiedzieć się więcej o dołączeniach.

Moje dokładne zapytanie zależałoby od dostępnych indeksów, ale najprawdopodobniej przypominałoby coś takiego:

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

To, co robię, to pisanie podzapytania, które łączy zamówienia i zamówienia produktów, gdzie date_ordered mieści się w określonym zakresie dat (polecam zapoznanie się z funkcją date_sub tutaj:http://www.w3schools.com/sql/func_date_sub.asp a także wykonaj kilka szybkich zapytań o zamówienia SELECT date_sub(date_ordered, INTERVAL X DAY) FROM, aby upewnić się, że rozumiesz, jak to obliczenie działa w praktyce.

Teraz otrzymuję listę zamówień z ostatnich X dni (7 w powyższym zapytaniu) i łączę ją z tabelą produktów zamówień, aby uzyskać zamówione produkty. Tutaj chcę w zasadzie deduplikować moje produkty. Product_id =300 mogło zostać zamówione 70 razy. Product_id =200 mógł zostać zamówiony 50 razy. Niezależnie od przypadku nie chcę łączyć 70 rekordów i 50 rekordów w mojej tabeli produktów dla identyfikatorów produktów 300 i 200, więc je zdeduplikowałem. To ostatnie oświadczenie GROUP BY to robi. Funkcjonalnie jest to to samo, co pisanie DISTINCT (chociaż mogą występować niewielkie różnice w sposobie ich obliczania w pewnych okolicznościach, żadna z tych okoliczności nie wydaje się tutaj mieć zastosowania... użyj DISTINCT, jeśli jest to dla Ciebie bardziej zrozumiałe)

Po otrzymaniu listy unikalnych identyfikatorów produktów, które zostały zamówione w ciągu ostatnich X dni, dołączam ją do tabeli produktów. Tutaj używam lewego sprzężenia. Podobnie jak w komentarzach wymienionych powyżej, będziesz chciał przyjrzeć się pojęciu złączeń dość uważnie. Zrób to, jeśli jeszcze tego nie zrobiłeś.

Na koniec stosuję filtr WHERE, który mówi „WHERE d.product_id IS NULL”. To oznacza:„OK, jeśli product_id =Y został zamówiony w ciągu ostatnich X dni, to pomyślnie dołączy do mojej tabeli produktów z a.product_id =d.product_id. Jeśli nie został zamówiony, a. product_id będzie istniał w moim zestawie wyników, ale d.product_id nie. Oznacza to, że d.product_id będzie miał wartość null."

Ten ostatni zwrot może być częścią, która nie jest widoczna / wyróżnia się.

Mam nadzieję że to pomoże.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. muszę skonfigurować django i mysql w IDE Pycharm

  2. MYSQL - policz liczbę wierszy w każdej tabeli

  3. Konwertuj to zapytanie na elokwentne

  4. MySQL, Połącz dwie kolumny

  5. MySQL DATE_FORMAT '%M' na krótki miesiąc?