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

truy vấn mysql trong một truy vấn có kiểm tra điều kiện bảo mật

Vui lòng thử truy vấn này (cũng trên SQL Fiddle ):

SELECT p.id, p.user_id, m.username, m.privacy,
       searcher.username "Searcher", p.status_msg
  FROM posts p
  JOIN members m ON m.id = p.user_id
  LEFT JOIN following f ON p.user_id = f.user_id
  JOIN members searcher ON searcher.username = 'userA'
 WHERE (m.privacy = 0 OR (m.privacy = 1 AND f.follower_id = searcher.id)
                      OR m.id = searcher.id)
   AND p.status_msg LIKE '%New%'
 ORDER BY p.id
 LIMIT 5;

Tôi đã xóa username trường từ posts bảng, vì nó là thừa. Ngoài ra, tôi đã đặt tên cho các bảng và cột hơi khác một chút, vì vậy truy vấn có thể cần các thay đổi thẩm mỹ cho giản đồ của bạn.

Dòng đầu tiên trong WHERE là mệnh đề mà bạn đang tìm kiếm, nó chọn các bài đăng theo thứ tự sau:

  1. Bài đăng đầu tiên của các thành viên không có quyền riêng tư;
  2. Sau đó, các bài đăng từ các thành viên được theo dõi bởi searcher hiện tại;
  3. Cuối cùng là các bài đăng của chính thành viên đó.

CHỈNH SỬA:

Truy vấn này đang sử dụng số nhận dạng ban đầu:

SELECT p.id, p.`userID`, m.username, m.privacy,
       searcher.username "Searcher", p.`statusMsg`
  FROM posts p
  JOIN `myMembers` m ON m.id = p.`userID`
  LEFT JOIN following f ON p.`userID` = f.user_id
  JOIN `myMembers` searcher ON searcher.username = 'userD'
 WHERE (m.privacy = 0 OR f.follower_id = searcher.id OR m.id = searcher.id)
   AND p.`statusMsg` LIKE '%New%'
 ORDER BY p.id
 LIMIT 5;

CHỈNH SỬA 2:

Để tránh trùng lặp trong trường hợp có một số người theo dõi người dùng từ posts bảng, nối và điều kiện lọc phải được thay đổi theo cách sau (trên SQL Fiddle ):

SELECT p.id, p.user_id, m.username, m.privacy,
       searcher.username "Searcher", p.status_msg
  FROM posts p
  JOIN members m ON m.id = p.user_id
  JOIN members searcher ON searcher.username = 'userC'
  LEFT JOIN following f ON p.user_id = f.user_id
   AND follower_id = searcher.id
 WHERE (m.privacy = 0 OR (m.privacy = 1 AND f.id IS NOT NULL)
                      OR m.id = searcher.id)  
 ORDER BY p.id
 LIMIT 5;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo liên kết từ mục dòng thời gian của Google Chart

  2. MySQL IFNULL () Giải thích

  3. PHP không thể phân giải tên vùng chứa mysql trong một số trường hợp nhất định

  4. Chiến lược truy vấn JDBC SQL phổ biến của Java cho Unit Test sử dụng HSQLDB và thời gian chạy bằng MySQL

  5. Đầu vào của người dùng, làm sạch và vệ sinh trước khi gửi đến db