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

chèn hoặc bỏ qua các mục trong truy vấn mysql dựa trên các điều kiện của kết quả

Nếu bạn cần phát hiện bản ghi nào đại diện cho đăng nhập mà không có bản ghi đăng xuất phù hợp và ngược lại, thì sẽ hữu ích khi mở rộng các bảng của bạn bằng một ID phiên duy nhất. Thêm một cột session_id , tạo giá trị của nó khi đăng nhập, ghi nhớ nó trong phiên và đặt cùng một giá trị cho session_id đối với lỗi đăng xuất. Nó sẽ đơn giản hóa các truy vấn rất nhiều.

Nếu bạn cần một truy vấn có thể thêm các bản ghi đăng nhập bị thiếu, hãy thử cách sau:

SELECT 0 AS idLoginnLog, l1.username, ADDTIME(l1.time, '-0:30:0') AS time, 1 AS type
FROM logs AS l1
  LEFT JOIN logs AS l2
  ON (l1.username=l2.username AND l2.type=1 AND l2.time BETWEEN ADDTIME(l1.time, '-0:30:0') AND l1.time)
WHERE
  l1.type=0
  AND l2.idLoginLog IS NULL

( Fiddle .) Bạn có thể chèn kết quả vào bảng (INSERT INTO logs (...) SELECT ... ) hoặc thêm truy vấn vào UNION trong truy vấn ban đầu của bạn.

Theo ghi nhận của @OlivierCoilland, truy vấn đang trở nên khá phức tạp và bạn có thể xem xét phân tích về phía ứng dụng. Bởi vì tôi đoán bảng nhật ký là khá lớn, bạn không nên tin rằng bạn sẽ phù hợp với tất cả các mục trong bộ nhớ. Bạn có thể sẽ cần một số loại kỹ thuật "cửa sổ trượt".

Tùy chọn thứ tư là xóa các bản ghi đăng xuất chưa khớp. Giải pháp của tôi cần một bảng tạm thời, vì vậy tôi không dán toàn bộ mã (khá dài) vào đây, chỉ xem chơi thử .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kết hợp điều kiện từ hai cột mysql

  2. Làm cách nào để sử dụng hàng câu lệnh SELECT IF trong mySQL để THAM GIA một bảng khác?

  3. Đang nhập bằng MySQL WorkBench ... lỗi ERROR 1046 (3D000)

  4. Truy vấn Doctrine để tìm tổng số Kết quả trong MySQL với LIMIT

  5. Điều này có thể nhận được tổng số hàng đếm với giới hạn bù không