2011-01-26 25 views
5

Tôi có một bảng, Lớp học và một bảng khác mà tôi gọi là "khóa học" - tức là các trường hợp của một lớp do một người cụ thể giảng dạy tại một địa điểm cụ thể. Tôi muốn kéo một bảng về cơ bản chỉ cho tôi thấy các lớp nào đang hoạt động dựa trên các tham số khóa học nhất định. Ví dụ:Tôi có thể THAM GIA hai bảng chỉ với một kết quả phù hợp cho mỗi hàng của một bảng trong MySQL không?

 
CLASSES 
class_id|class_name 
--------|------------ 
     1|Class One 
     2|Class Two 
     3|Different Class 
etc... 

COURSES 
course_id|class_id|room 
---------|--------|-------- 
     1|  3|  1 
     2|  3|  2 
     3|  1|  1 
     4|  3|  1 
     5|  3|  2 
     6|  2|  1 
etc... 

Tôi tự hỏi liệu có cách nào tôi có thể chỉ nhận được một ví dụ như SELECT classes.* FROM classes JOIN courses ON classes.class_id=courses.class_id WHERE courses.room=1 để chỉ trả về một phiên bản của mỗi lớp. Những gì đang xảy ra là tôi chỉ nhận được các lớp học diễn ra trong phòng 1, nhưng tôi đang nhận được nhiều trường hợp của mỗi vì có nhiều trường hợp của lớp đó trong bảng khóa học trong phòng 1.

Tôi đã đã thử tất cả các loại khác nhau của JOIN - bên trái, bên phải, bên trong, v.v ... - và bởi vì tôi đang kéo từ một bảng dựa trên thông số kỹ thuật từ một bảng khác, tất cả chúng đều cho tôi kết quả tương tự.

Vì vậy, tôi nhận được:

 
class_id| class_name |course_id|room 
--------|--------------|---------|-------- 
     1|Class One  |  3|  1 
     2|Class Two  |  6|  1 
     3|Diferent Class|  1|  1 
     3|Diferent Class|  4|  1 
etc... 

Nhưng tôi muốn chỉ nhận được:

 
class_id| class_name |course_id|room 
--------|--------------|---------|-------- 
     1|Class One  |  3|  1 
     2|Class Two  |  6|  1 
     3|Diferent Class|  1|  1 
etc... 

Tôi có thể có nó chỉ JOIN vào trận đấu đầu tiên cho mỗi hàng trong lớp học? Tôi là người mới với MySQL nên tôi gặp một chút rắc rối khi thể hiện những gì tôi muốn làm rõ ràng; Tôi xin lỗi.

Ngoài ra: Tôi đang chuyển tất cả điều này vào PHP qua PDO - có thể có một cách cụ thể để thực hiện việc này trong PDO?

+1

Nếu bạn chỉ muốn một bản ghi từ bảng COURSES, bạn muốn bản ghi nào trong số đó? IE: Luôn luôn giá trị courseid (& room?) Thấp nhất? –

+0

Nó thành thật không quan trọng. Bạn nói đúng tôi nên đã nói rằng. Tôi chỉ đi cho dữ liệu CLASSES; lý do duy nhất tôi đi cho COURSE là chỉ nhận được những Lớp học có các khóa học tương ứng với các tiêu chuẩn chính xác. –

Trả lời

8
SELECT 
    classes.class_id, 
    classes.name, 
    courses.room 
FROM classes 
    JOIN courses 
     ON classes.class_id=courses.class_id 
WHERE courses.room=1 
GROUP BY classes.class_id,classes.name,courses.room 

GROUP BY cho phép bạn kết quả tổng hợp trên các trường được chỉ định, vì vậy (trong trường hợp này) nó sẽ chỉ lấy một bộ duy nhất của (classes.class_id, classes.name, courses.room)

để biết thêm chi tiết http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html

+0

Không chọn các cột khóa học không có nghĩa là đầu ra sẽ không bị trùng lặp. –

+0

@OMG Ngựa con nhưng nhóm "theo" sẽ – Ass3mbler

+0

tôi đã thêm ràng buộc GROUP BY, truy vấn trên câu hỏi không chọn bất kỳ dữ liệu nào về khóa học – Dalen

2
SELECT cl.class_id, cl.class_name, c.course_id, c.room 
FROM classes cl 
JOIN courses c 
ON  c.course_id = 
     (
     SELECT ci.course_id 
     FROM courses ci 
     WHERE ci.class_id = cl.class_id 
       AND ci.room = 1 
     ORDER BY 
       ci.class_id, ci.course_id -- or whatever 
     LIMIT 1 
     ) 

Bằng cách thay đổi các điều khoản ORDER BY trong subquery, bạn có thể xác định đó của các lớp sẽ được trả lại (nghĩa với ít nhất hoặc lớn nhất id vv)

+1

Điều này dường như hoạt động, nhưng phải mất phpMyAdmin 76 giây để thực thi. Bất kỳ ý tưởng gì có thể gây ra điều đó? –

+0

@Ben: tạo chỉ mục trên 'khóa học (class_id, phòng, id)' – Quassnoi

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