Asked Jun 3rd, 4:55 AM 118 1 1
  • 118 1 1
+2

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

Share
  • 118 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 ANSWERS


Answered Jun 3rd, 6:42 AM
+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.
Share
TinhTN @tinhtn89
Jun 3rd, 6:51 AM

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
0
| Reply
Share
Jun 3rd, 6:52 AM

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

0
| Reply
Share
Jun 3rd, 6:53 AM

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

0
| Reply
Share
Jun 3rd, 6:53 AM

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.
0
| Reply
Share
TinhTN @tinhtn89
Jun 3rd, 6:54 AM

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

0
| Reply
Share
Jun 3rd, 6:55 AM

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.

0
| Reply
Share
TinhTN @tinhtn89
Jun 3rd, 7:11 AM

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

0
| Reply
Share
Midoriniji @Midoriniji
Jun 3rd, 8:44 AM

@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

+1
| Reply
Share
Jun 4th, 1:43 AM

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

0
| Reply
Share
TinhTN @tinhtn89
Jun 4th, 3:42 AM

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

0
| Reply
Share
Midoriniji @Midoriniji
Jun 4th, 6:25 AM

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

0
| Reply
Share
TinhTN @tinhtn89
Jun 4th, 8:22 AM

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

0
| Reply
Share