Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL Заявки за множество таблици

Добре, така че макар да съм съгласен отчасти, че трябва да се поразровите и да научите повече за левите съединения, има и някои трудности да отговорите правилно на този въпрос, които може да бъдат пропуснати от начинаещия. Ще продължа и ще ви помогна да отговорите, но бих препоръчал да научите повече за присъединяванията.

Точната ми заявка ще зависи от наличните индекси, но много вероятно прилича на нещо подобно:

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

Това, което правя е, че пиша подзаявка, която обединява поръчки и продукти заедно, където date_ordered попада в определен период от време (бих препоръчал да научите за функцията date_sub тук:http://www.w3schools.com/sql/func_date_sub.asp и също така направете няколко бързи SELECT date_sub(date_ordered, INTERVAL X DAY) FROM заявки за поръчки, за да сте сигурни, че разбирате как работи това изчисление на практика.

Сега получавам моя списък с поръчки за последните X дни (7 в заявката по-горе) и го свързвам с продуктовата таблица на поръчките, за да получа поръчаните продукти. Тук искам да дедуплирам продуктите си по същество. Product_id =300 може да е поръчан 70 пъти. Product_id =200 може да е поръчан 50 пъти. Какъвто и да е случаят, не искам да присъединявам 70 записа и 50 записа към моята продуктова таблица за идентификатори на продукти 300 и 200, така че ги дедуплирам. Последният оператор GROUP BY прави това. Функционално е същото нещо като писането на DISTINCT (въпреки че може да има малки разлики в начина, по който се изчисляват при определени обстоятелства, нито едно от тези обстоятелства не изглежда да е приложимо тук... използвайте DISTINCT, ако това е по-ясно за вас)

След като имам своя списък с уникални идентификационни номера на продукти, поръчани през последните X дни, се присъединявам към него с моята продуктова таблица. Тук използвам ляво съединение. Подобно на коментарите, отбелязани по-горе, ще искате да разгледате идеята за присъединяване доста внимателно. Направете го, ако още не сте го направили.

Последно, прилагам WHERE филтър, който казва "WHERE d.product_id IS NULL." Това, което прави, е да каже:„Добре, ако product_id =Y е поръчан през последните X дни, тогава той ще се присъедини към моята таблица с продукти успешно с a.product_id =d.product_id. Ако не е поръчан, тогава a. product_id ще съществува в моя набор от резултати, но d.product_id няма. Тоест d.product_id ще бъде null."

Този последен обрат може да е частта, която не е очевидна/открояваща се.

Надявам се това да помогне.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Има ли списък с неразрешени знаци за имената на колоните на mysql таблицата?

  2. Изберете MAX или Order By Limit 1

  3. java.sql.SQLException:Неправилна стойност на низа:'\xF0\x9F\x91\xBD\xF0\x9F...'

  4. Игнориране на годината в SQL заявка с период от време

  5. Предупреждение:mysql_num_rows() очаква параметър 1 да бъде ресурс, булев, даден в /home/folder/public_html/folder/folder/login.php на ред 18