Yêu cầu thg 6 3, 2021 4:55 SA 186 1 1
  • 186 1 1
+2

Tìm ra những học sinh có điểm giống nhau trong laravel

Chia sẻ
  • 186 1 1

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


Đã trả lời thg 6 3, 2021 6:42 SA
+2

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ả:

Web capture_3-6-2021_134556_sqlfiddle.com.jpeg

Link demo: http://sqlfiddle.com/#!9/9b237e/19

-- Update ---

Cách mình truy vấn:

  1. 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
  2. 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.
Chia sẻ
Avatar TinhTN @tinhtn89
thg 6 3, 2021 6:51 SA

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
thg 6 3, 2021 6:52 SA

@tinhtn89 Mình có update thêm giải thích ở trên rồi nhé.

thg 6 3, 2021 6:53 SA

@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ự.

thg 6 3, 2021 6:53 SA

Cách mình truy vấn:

  1. 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
  2. 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.
Avatar TinhTN @tinhtn89
thg 6 3, 2021 6:54 SA

à, Ok, mình hiểu rồi, cảm ơn bạn

thg 6 3, 2021 6:55 SA

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.

Avatar TinhTN @tinhtn89
thg 6 3, 2021 7:11 SA

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. sai1.JPG

Avatar Midoriniji @Midoriniji
thg 6 3, 2021 8:44 SA

@tinhtn89 Bạn thử cách này nhé

SELECT 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

thg 6 4, 2021 1:43 SA

@tinhtn89 Ừm hôm trước mình cũng nghĩ tới case này, mình định comment là bạn đổi qua thành nối các số điểm thành một chuỗi để tránh trường hợp đấy. Các của bác @tinhtn89 cũng là một hướng. Bạn tham khảo nhé.

Avatar TinhTN @tinhtn89
thg 6 4, 2021 3:42 SA

@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.

Avatar Midoriniji @Midoriniji
thg 6 4, 2021 6:25 SA

@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 )

Avatar TinhTN @tinhtn89
thg 6 4, 2021 8:22 SA

@Midoriniji Thanks, Đúng mục đích sử dụng luôn. http://sqlfiddle.com/#!9/16654f/1 Many Thanks

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí