Lỗi Operand should contain 1 column(s) từ MySQL

Chào mọi người.
Mình gặp vài sự cố nên xin mọi người giúp đỡ, chả là mình đang cố gắng xóa các hàng trùng lặp nhưng nó hiện ra lỗi Operand should contain 1 column(s) từ MySQL.

  • Đầu tiên mình liệt kê các sinh viên đã học các môn, kể cả các sinh viên bị trùng môn học (sinh viên học 1 môn học trong 1 học kì nhưng khác điểm) vào bảng tạm.
  • Từ bảng tạm mình liệt kê ra các sinh viên học 1 môn học trong 1 học kì
  • Lệnh cuối cùng là xóa những trùng lăp này (Dựa vào bảng tạm vừa liệt kệ trên) và in ra màn hình nhưng ăn lỗi

Xin mọi người xem mình có sai chỗ nào không, và nếu sai hàm xóa thì mình phải làm như thế nào

Toàn bộ lệnh truy vấn:

/* Liệt kê các môn sinh viên đã học, bao gồm các môn bị trùng lặp trong một học kì */

create temporary table tmp as (
select SV.MSSV, HoTenSv, TenMon, Diem, HKNH
from sinhvien as SV inner join pnt as P on SV.MSSV = P.MSSV
					inner join LopMH as L on P.MaLop = L.MaLop
					inner join Mon as M on L.MaMon = M.MaMon
group by SV.MSSV, HoTenSv, TenMon, Diem, HKNH 
);
select * from tmp;
drop temporary table tmp;
/*-------------------------------------------------------------------------------*/

/*Liệt kê các sinh viên học một môn ở một học kì xuất hiện 2 lần */

select MSSV, HoTenSv, TenMon
from tmp
group by MSSV, HoTenSv, TenMon
having count(*)>=2
order by MSSV asc;

/* Xóa dòng trùng nhau */

delete from tmp
where (select MSSV, HoTenSv, TenMon
from tmp
group by MSSV, HoTenSv, TenMon
having count(*)>=2
); /* Nơi bị lỗi */

Where clause của cậu không phải là 1 biểu thức hợp lệ.

delete from tmp
where (select MSSV, HoTenSv, TenMon
from tmp
group by MSSV, HoTenSv, TenMon
having count(*)>=2
);

Tớ muốn hỏi cậu mấy câu, mong nhận được lời giải đáp:

  • Tại sao cậu lại xóa trong bảng tạm mà không phải là xóa record ở sinhvien, pnt? Nếu cậu không muốn dòng trùng lặp trong bảng tạm, cậu có thể sửa câu create để các bản ghi không bị trùng lặp mà :smiley:
  • Cậu đã drop temporary table rồi, vậy cậu có gì đâu để xóa? :smiley:
  • Khi cậu liệt kê các sinh viên học 1 môn ở 1 học kỳ, tớ không thấy có xuất hiện trường nào chỉ “học kỳ” ở đây. Như vậy cậu có thể liệt kê ra cả những sinh viên học lại (cùng môn, khác kỳ). Đó có phải là kỳ vọng của cậu được không?
2 Likes
  1. Mình định xóa dữ liệu trong bảng tạm để lấy dữ liệu á bạn, sau khi xóa xong mình sẽ insert nó vào bảng mới.
  2. Lệnh drop chỉ chạy khi mình excute, sau khi excute thì bảng sẽ bị xóa
  3. Có thể thầy cố ý làm vậy để mình xóa á bạn, VD như:

bảng tạm:

MSSV Hotensv Tenmon Diem HKNH
S1 ABC CSDL 2 2020-02-01
S1 ABC CSDL 3 2020-02-01
S2 XYZ Tieng anh 8 2019-07-01
S2 XYZ Tieng anh 6 2019-07-01
S2 XYZ Tieng anh 9 2019-07-01

Ở đây mình cần xóa môn bị trùng, giữ lại môn có điểm cao nhất từ bảng tạm này. Sau đó mình định insert dữ liệu đã xóa vào bảng mới.

Trời đất!
Cậu có thể ăn bằng cách gắp đồ ăn lên miệng, sao cậu lại muốn tự làm khó mình bằng cách vòng tay qua đầu rồi mới đưa đồ ăn lên miệng vậy?

Để tớ dạy cậu cách gắp đồ ăn, vòng tay qua chân rồi đưa lên miệng nhé! :smiley:
Cậu tạo thêm 1 bảng tạm mới:

create temporary table food as (
  select MSSV, HoTenSv, TenMon, concat(MSSV, HoTenSv, TenMon) as conmeo
  from tmp
  group by MSSV, HoTenSv, TenMon
  having count(*)>=2
  order by MSSV asc
);

delete from tmp
where concat(MSSV, HoTenSv, TenMon) in (select conmeo from food);
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?