Tìm ra những học sinh có điểm giống nhau trong laravel
Mình có 1 bảng học sinh .
hoten | toan | ly | hoa | van | su |
---|---|---|---|---|---|
Lan | 7 | 6 | 5 | 4 | 5 |
Ngo | 8 | 7 | 5 | 8 | 2 |
Mui | 8 | 5 | 7 | 8 | 3 |
Lin | 7 | 6 | 5 | 4 | 4 |
Làm sao để lấy ra danh sách hoặc đếm xem có bao nhiêu học sinh có điểm ( Toán, Lý, Hóa) giống hệt nhau. Tức là như dữ liệu bên trên chỉ có Lan và Lin là đủ điều kiện có điểm Toán , Lý HÓa giống nhau. Cảm ơn mn.
1 CÂU TRẢ LỜI
Mình tạm đặt tên bảng dữ liệu bạn cung cấp trong câu hỏi là students
.
Bạn tham khảo câu truy vấn sau nhé:
SELECT *
FROM students
WHERE (toan * 100 + ly * 10 + hoa) in (
SELECT (toan * 100 + ly * 10 + hoa) as groupScore
FROM students as s
GROUP BY groupScore
HAVING COUNT(id) > 1
ORDER BY groupScore DESC
)
ORDER BY (toan * 100 + ly * 10 + hoa) DESC;
Kết quả:
Link demo: http://sqlfiddle.com/#!9/9b237e/19
-- Update ---
Cách mình truy vấn:
- Tìm ra nhóm các bạn có điểm 2 môn giống hệt nhau bằng công thức:
Toán * 100 + Lý * 10 + Hóa
, gọi làgroupScore
, đồng thời lọc luôn các nhóm thực sự có số học sinh từ 2 bạn. Nhóm 1 HS thì tức là bạn ý không có ai giống điểm. VD: Toán 7, Lý 6, Hóa 0 => Group 760; Toán 10, Lý 9, Hóa 5 => 1095 - Truy vấn lấy ra danh sách học sinh thuộc các nhóm có điểm bị trùng ở câu truy vấn số 1. MÌnh sort lại theo groupScore của học sinh để các bạn cùng nhóm điểm giống nhau thì sẽ xếp liền nhau cho tiện quan sát.
Cảm ơn bạn, Bạn giải thích thêm được không?
- *10 để làm gì?
- của bạn đang đúng khi thống kê toán, lý, nhưng hóa thì không đúng. ( ít nhất cần 3 trường Toán, Lý, Hoá) Thanks
@tinhtn89 Mình có update thêm giải thích ở trên rồi nhé.
@tinhtn89 À mịnh đọc nhầm câu hỏi nên tưởng tìm muốn tìm các bạn có 2 điểm Toán Lý giống nhau. Bạn sửa lại công thức Toán lý với toán lý hóa thì kết quả vẫn lọc ra tương tự.
Cách mình truy vấn:
- Tìm ra nhóm các bạn có điểm 2 môn giống hệt nhau bằng công thức: Toán * 10 + Lý, gọi là groupScore, đồng thời lọc luôn các nhóm thực sự có số học sinh từ 2 bạn. Nhóm 1 HS thì tức là bạn ý không có ai giống điểm. VD: Toán 7, Lý 6 => Group 76; Toán 10, Lý 9 => 109
- Truy vấn lấy ra danh sách học sinh thuộc các nhóm có điểm bị trùng ở câu truy vấn số 1. MÌnh sort lại theo groupScore của học sinh để các bạn cùng nhóm điểm giống nhau thì sẽ xếp liền nhau cho tiện quan sát.
à, Ok, mình hiểu rồi, cảm ơn bạn
Bạn xét 3 môn thì có thể thay công thức là: Toán * 100 + Lý * 10 + Hóa
Mục đích là tính ra một con số là group id cho các bạn cùng trùng điểm 3 môn thôi ý bạn.
Mình vừa xem lại, nếu bài toán chỉ đơn giản là điểm học sinh 0-10 thì hoàn toàn đúng, nhưng nếu nâng cao lên nó ko phải là điểm 0-10 nữa mà 0-1000 thì không dùng công thức này được.
1x100 + 1x10 + 11 = 121 1x100 + 2x10 + 1 = 121
Với dữ liệu này sẽ cho kết quả sai.
@Midoriniji Cách này nếu có 2 kết quả thì đúng, từ 2 trở lên sẽ bị nhân lên rất nhiều. VD: có 8 người giống điểm nhau thì nó sẽ list kết quả ra 8x7=56 bản ghi.
@tinhtn89 bạn thêm distinct hoặc group by vào như này
SELECT distinct a.* FROM students a inner join students b on b.toan = a.toan and b.ly = a.ly and b.hoa = a.hoa and b.id <> a.id
hoặc dùng where exists như này
SELECT * FROM students a where exists ( select 1 from students b where b.toan = a.toan and b.ly = a.ly and b.hoa = a.hoa and a.id <> b.id )
@Midoriniji Thanks, Đúng mục đích sử dụng luôn. http://sqlfiddle.com/#!9/16654f/1 Many Thanks