2012-10-29 16 views
6

Đây là vấn đề ở chế độ tiết. Tôi có các trường hợp chứng nhận trên một bảng chứng nhận và tất cả họ đều có một loại và một sinh viên liên kết với họ. Dưới đây là những gì tôi muốn xảy ra, tôi muốn kéo tất cả các chứng chỉ với thời gian hết hạn nằm trong phạm vi ngày (NOW đến 1 năm). Nếu họ đủ điều kiện cho tham số đó, tuyệt vời nhưng sau đó tôi muốn loại trừ học sinh nếu họ có thời hạn xác nhận lớn hơn phạm vi khi cùng loại với chứng chỉ nằm trong phạm vi - họ không cần phải tham gia báo cáo. Dưới đây là câu hỏi đầu tiên mà tôi có:Truy vấn SQL để bao gồm ngày hết hạn nằm trong một phạm vi, nhưng sau đó loại trừ nếu chúng có một phiên bản khác cùng loại

SELECT s.student_id, s.fname, s.address1, s.lname, s.zip, s.state, s.city, s.student_type 
      FROM students s, certifications c 
      WHERE (s.student_id = c.student_id) 
      AND s.status='A' 
      AND s.student_type != 'B' 
      AND s.student_type != 'D' 
      AND s.student_type != 'E' 
      AND s.student_type != 'W' 
      AND s.student_type != 'T' 
      AND s.student_type != 'I' 
      AND c.expiration >= CURDATE() AND c.expiration <= DATE_ADD(NOW(), INTERVAL 1 YEAR) 
      GROUP BY s.student_id 
      ORDER BY s.lname, s.fname 

Sau đó, sql mà thực sự có được của thông tin của cert dựa trên báo cáo sql trước:

SELECT c.cert_num, c.date, expiration, ct.name, ct.cert_type, c.cert_id, c.student_id 
       FROM certifications c, cert_type ct 
       WHERE student_id = '{$Row['student_id']}' 
       AND ct.cert_type = c.cert_type 
       ORDER BY ct.name ASC, expiration DESC 

Vì vậy, để tóm tắt, vấn đề mà tôi đang chạy vào là sinh viên sẽ xuất hiện nếu hết hạn chứng chỉ của họ trong vòng một năm kể từ bây giờ và nếu họ có một chứng chỉ cùng loại có thời gian hết hạn lớn hơn phạm vi. Điêu đo không tôt.

Có cách nào để kiểm tra để đảm bảo loại chứng chỉ nhất định nằm trong phạm vi ngày và nếu vậy, hãy đảm bảo rằng họ không có chứng chỉ cùng loại lớn hơn phạm vi? Nó không quan tâm nếu nó có một truy vấn sql khác.

Trả lời

1

Có thể tôi đã đơn giản hóa vấn đề, nhưng bạn có thể không chỉ nhận được ngày hết hạn tối đa cho bất kỳ kết hợp học sinh/loại nào không? ví dụ.

SELECT s.student_id, 
     s.fname, 
     s.address1, 
     s.lname, 
     s.zip, 
     s.state, 
     s.city, 
     s.student_type 
FROM Students s 
     INNER JOIN 
     ( SELECT c.student_ID, 
        c.Cert_Type, 
        MAX(Expiration) AS Expiration 
      FROM Certifications c 
      GROUP BY c.student_ID, c.Cert_Type 
     ) c 
      ON s.Student_ID = c.Student_ID 
WHERE s.Student_Type NOT IN ('B', 'D', 'E', 'W', 'T', 'I') 
AND  c.expiration >= CURDATE() AND c.expiration <= DATE_ADD(NOW(), INTERVAL 1 YEAR) 
GROUP BY s.student_id, s.fname, s.address1, s.lname, s.zip, s.state, s.city, s.student_type 
+0

Đây là sản phẩm phù hợp với tôi! Cảm ơn GarethD rất nhiều! Xin lỗi bài viết gốc của tôi không có ý nghĩa gì cả, đó là vào cuối ngày làm việc của tôi. Dù sao, cảm ơn tất cả những gì đã trả lời, tôi đã học được khá nhiều từ bài viết của bạn. Tôi cũng nhận ra rằng tôi sẽ phải đọc thêm về 'tham gia'. –

1

Sử dụng một subquery:

SELECT s.student_id, s.fname, s.address1, s.lname, s.zip, s.state, s.city, s.student_type 
    FROM students s, certifications c 
    WHERE (s.student_id = c.student_id) 
    AND s.status='A' 
    AND s.student_type != 'B' 
    AND s.student_type != 'D' 
    AND s.student_type != 'E' 
    AND s.student_type != 'W' 
    AND s.student_type != 'T' 
    AND s.student_type != 'I' 
    AND c.expiration >= CURDATE() AND c.expiration <= DATE_ADD(NOW(), INTERVAL 1 YEAR) 
    AND NOT EXISTS (
     SELECT c_inner.id 
     FROM certifications c_inner 
     WHERE c.expiration > DATE_ADD(NOW(), INTERVAL 1 YEAR) 
     AND c.student_id = c_inner.student_id 
    ) 
    GROUP BY s.student_id 
    ORDER BY s.lname, s.fname 

Tôi nghĩ rằng chúng ta có thể để cấu trúc lại này thành một tham gia, trong đó có thể cung cấp hiệu suất tốt hơn.

0
SELECT s.student_id, s.fname, s.address1, s.lname, s.zip, s.state, s.city, s.student_type 
    FROM students s 
    JOIN certifications c ON c.student_id = s.student_id 
    LEFT JOIN certifications c2 ON c2.student_id = s.student_id 
AND c2.expiration > DATE_ADD(NOW(), INTERVAL 1 YEAR) 
    JOIN cert_type ct ON ct.cert_type=c.cert_type 
    WHERE (s.student_id = c.student_id) 
    AND s.status='A' 
    AND s.student_type != 'B' 
    AND s.student_type != 'D' 
    AND s.student_type != 'E' 
    AND s.student_type != 'W' 
    AND s.student_type != 'T' 
    AND s.student_type != 'I' 
    AND c.expiration >= CURDATE() AND c.expiration <= DATE_ADD(NOW(), INTERVAL 1 YEAR) 
    AND c2.student_id is null 
    ORDER BY s.lname, s.fname 
+0

Tôi đã thêm một tham gia để lấy thông tin từ cert_type trong một truy vấn. –

Các vấn đề liên quan