第一次尝试
SELECT s.name,s.email,s.student_id,a.hostel_id,s.image,s.course_id,s.year, s.address
FROM sys_student_account s, sys_room_allotment a
WHERE s.student_id!=a.student_id AND s.name like 'SAMS%'
GROUP BY s.student_id ORDER BY s.name LIMIT 0,20
第二次尝试
SELECT s.name,s.email,s.student_id,a.hostel_id,s.image,s.course_id,s.year, s.address
FROM sys_student_account s, sys_room_allotment a
WHERE NOT(s.student_id=a.student_id) AND s.name like 'SAMS%'
GROUP BY s.student_id ORDER BY s.name LIMIT 0,20
有人可以帮我吗?
答案 0 :(得分:1)
您需要正确理解联接。您的代码提供的结果与您想要的完全不同。
使用以下代码段:
std::map
注意:检查是否需要from sys_student_account s
left join sys_room_allotment a on ( s.student_id=a.student_id)
where a.student_id is NULL and s.name like 'SAMS%'
子句并相应地实施。
答案 1 :(得分:0)
连接,无论是隐式连接还是显式连接,都会在两个表之间创建笛卡尔积 - 它将第一个表中的每一行与另一个表中的每一行配对。这个结果通过连接条件缩小,这应该确保根据您的模式根据某些逻辑完成这些匹配。在这种情况下,您试图加入sys_student_account
中的行与sys_room_allotment
中具有不同student_id
的每一行 - 这实际上并不是您想要实现的。一种更简单的方法可能是使用exists
运算符而不是连接:
SELECT s.* -- or any other fields from sys_student_account
FROM sys_student_account s
WHERE NOT EXISTS (SELECT *
FROM sys_room_allotment a
WHERE s.student_id = a.student_id)
ORDER BY s.name