Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Truy vấn MySQL Nhiều Bảng

Được rồi, vì vậy mặc dù tôi đồng ý một phần rằng bạn nên thực hiện một số thao tác tìm hiểu thêm về các phép nối bên trái, nhưng cũng có một số khó khăn để trả lời câu hỏi này một cách chính xác mà có thể bị mất đối với người mới bắt đầu. Tôi sẽ tiếp tục và giúp bạn trả lời nó, nhưng tôi khuyên bạn nên tìm hiểu thêm về các phép tham gia.

Truy vấn chính xác của tôi sẽ phụ thuộc vào các chỉ số có sẵn, nhưng nó rất có thể giống như sau:

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

Những gì tôi đang làm là tôi đang viết một truy vấn con nối các đơn hàng và đặt hàng sản phẩm với nhau, trong đó date_ordered nằm trong một phạm vi ngày nhất định (Tôi khuyên bạn nên tìm hiểu về hàm date_sub tại đây:http://www.w3schools.com/sql/func_date_sub.asp và cũng thực hiện một số truy vấn nhanh chóng CHỌN date_sub (date_ordered, INTERVAL X DAY) TỪ đơn đặt hàng để đảm bảo bạn hiểu cách tính toán này hoạt động trong thực tế.

Bây giờ, tôi nhận được danh sách đơn đặt hàng của mình trong X ngày qua (7 trong truy vấn ở trên) và tôi kết hợp nó với bảng sản phẩm đơn đặt hàng để lấy các sản phẩm đã đặt. Ở đây, về cơ bản, tôi muốn loại trừ các sản phẩm của mình. Product_id =300 có thể đã được đặt hàng 70 lần. Product_id =200 có thể đã được đặt hàng 50 lần. Dù trường hợp có thể xảy ra là gì, tôi không muốn kết hợp 70 bản ghi và 50 bản ghi vào bảng sản phẩm của mình cho id sản phẩm 300 và 200, vì vậy tôi loại trừ chúng. Câu lệnh GROUP BY cuối cùng thực hiện điều đó. Về mặt chức năng, nó giống như cách viết DISTINCT (mặc dù có thể có những khác biệt nhỏ về cách tính toán trong một số trường hợp nhất định, nhưng không có trường hợp nào trong số đó có vẻ áp dụng ở đây ... hãy sử dụng DISTINCT nếu điều đó rõ ràng hơn cho bạn)

Sau khi tôi có danh sách id sản phẩm duy nhất đã được đặt hàng trong X ngày qua, tôi kết hợp danh sách đó với bảng sản phẩm của mình. Ở đây, tôi sử dụng một phép nối bên trái. Giống như các nhận xét được lưu ý ở trên, bạn sẽ muốn xem xét khái niệm về các phép nối khá cẩn thận. Làm điều đó, nếu bạn chưa làm.

Cuối cùng, tôi áp dụng bộ lọc WHERE cho biết "WHERE d.product_id IS NULL." Điều này đang làm là nói, "được rồi, nếu product_id =Y đã được đặt hàng trong X ngày qua, thì nó sẽ tham gia thành công vào bảng sản phẩm của tôi với a.product_id =d.product_id. Nếu nó không được đặt hàng, thì a. product_id sẽ tồn tại trong tập kết quả của tôi, nhưng d.product_id thì không. Nghĩa là, d.product_id sẽ là null. "

Vòng xoắn cuối cùng đó có thể là phần không rõ ràng / nổi bật.

Hi vọng điêu nay co ich.




  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:Tôi có thể thực hiện phép nối bên trái và chỉ kéo một hàng từ bảng tham gia không?

  2. Cài đặt MySQL trong Docker không thành công với thông báo lỗi Không thể kết nối với máy chủ MySQL cục bộ thông qua socket

  3. MySQL Row to Column

  4. Tại sao vẫn có thể chèn một khóa ngoại không tồn tại?

  5. Chỉ mục MySQL làm chậm truy vấn