sql >> Databáze >  >> RDS >> Mysql

MySQL dotazování na více tabulek

Dobře, takže i když částečně souhlasím s tím, že byste se měli trochu šťourat a dozvědět se více o levých spojích, je zde také určitá záludnost, jak správně odpovědět na tuto otázku, což může začátečník ztratit. Pokračuji a pomůžu vám odpovědět, ale doporučoval bych dozvědět se více o připojeních.

Můj přesný dotaz by závisel na dostupných indexech, ale velmi pravděpodobně se podobá něčemu takovému:

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 dělám, je, že píšu poddotaz, který spojuje objednávky a objednává produkty dohromady, kde date_ordered spadá do určitého období (doporučoval bych se dozvědět o funkci date_sub zde:http://www.w3schools.com/sql/func_date_sub.asp a také proveďte několik rychlých SELECT date_sub(date_ordered, INTERVAL X DAY) FROM objednávek, abyste se ujistili, že rozumíte tomu, jak tento výpočet v praxi funguje.

Nyní dostávám svůj seznam objednávek za posledních X dní (7 ve výše uvedeném dotazu) a připojuji jej k tabulce produktů pro objednávky, abych získal produkty, které byly objednány. Zde chci v podstatě zbavit své produkty. Product_id =300 může být objednáno 70krát. Product_id =200 může být objednáno 50krát. Ať je to jakkoli, nechci připojovat 70 záznamů a 50 záznamů ke své tabulce produktů pro ID produktů 300 a 200, takže jsem je odstranil. Poslední příkaz GROUP BY to dělá. Funkčně je to totéž, jako když píšete DISTINCT (i když za určitých okolností mohou existovat drobné rozdíly v tom, jak se tyto počítají, žádná z těchto okolností zde zřejmě neplatí... použijte DISTINCT, pokud je vám to jasnější)

Jakmile budu mít svůj seznam jedinečných ID produktů, které byly objednány za posledních X dní, připojím je k mé tabulce produktů. Zde používám levé spojení. Stejně jako výše uvedené komentáře se budete chtít podívat na pojem spojení velmi pečlivě. Udělejte to, pokud jste to ještě neudělali.

Nakonec použiji filtr WHERE, který říká „WHERE d.product_id IS NULL“. Tím se říká:„Dobře, pokud byl product_id =Y objednán v posledních X dnech, pak se úspěšně připojí k mé tabulce produktů s a.product_id =d.product_id. Pokud nebyl objednán, pak a. product_id bude v mé sadě výsledků existovat, ale d.product_id nikoli. To znamená, že d.product_id bude mít hodnotu null."

Ten poslední zvrat může být část, která není zjevná / vyčnívající.

Snad to pomůže.




  1. Porovnání nabídek Galera Cluster Cloud:Část třetí Microsoft Azure

  2. SQLSTATE[HY000] [1698] Přístup odepřen uživateli 'root'@'localhost'

  3. PostgreSQL ekvivalent NoLock Hint SQLServeru

  4. MySQL Fire-And-Forget INSERT / UPDATE / DELETE - doporučuje se použití mysql_unbuffered_query?