我有一个学生数据库,他们有一个全名,一个地点,以及他们经常光顾的学校名单。
"学生"表
id | fullname | location
------------------------
"位置"表
id | zipcode | city
-------------------
"学校"表
id | name
---------
" student_school" table(在学校拥有两个外键,用户为每个用户创建学校列表)
id | id_student | id_school
---------------------------
我希望通过学生进行搜索,将搜索词与student.fullname,location.zipcode,location.city,school.name进行比较,并返回与这些条件中的一个(或多个)匹配的所有学生。 请注意,学生可以有一个空位置,因此我们需要一个extern连接。
答案 0 :(得分:0)
以下是基于正则表达式的匹配示例:
SELECT distinct s.id, s.fullname
FROM student_school ss
JOIN student s ON s.id = ss.id_student
LEFT JOIN LOCATION l ON s.LOCATION = l.id
JOIN school sc ON ss.id_school = sc.id
WHERE (s.fullname RLIKE 'Sasha.*') or
(ifnull(l.zipcode RLIKE '100.*', 0)) or
(ifnull(l.city RLIKE 'New.*', 0)) or
(sc.name RLIKE '.*2')
这里是完整的SQL fiddle
因此,一般的想法是加入所有学生数据,过滤符合至少一个标准的行,并使用distinct来分组数据,避免重复结果。
<强>更新强>
要包含没有学校记录的学生,您可以使用以下短语:
student_school ss
RIGHT JOIN student s ON s.id = ss.id_student
LEFT JOIN LOCATION l ON s.LOCATION = l.id
LEFT JOIN school sc ON ss.id_school = sc.id