我目前在使用 MySQL 进行搜索查询时遇到了一些问题。
我有一个表,用于存储课程不同字段的表单数据,带有两个外键(courseid 和 fieldid)。有一个数据字段,用于存储课程字段的表单数据。该表的结构如下:
编号 | 课程编号 | 字段编号 | 数据
我正在对课程进行高级搜索,用户可以在其中指定他们想要过滤的字段。其中一些字段查询这个表。注意:我无法使用 courseid,因为我正在将此表与另一个表连接起来。另一个表是课程表本身,我在那里搜索课程的名称。
我有这样的查询:
SELECT DISTINCT c.name FROM `course_table` c
INNER JOIN `form_table` f ON c.id = f.courseid
WHERE (c.name LIKE '%hah%')
AND (f.fieldid = 2 AND f.data BETWEEN 1371160800 AND 1529000797)
AND (f.fieldid = 8 AND f.data LIKE '%foo%')
AND (f.fieldid = 4 AND f.data LIKE 'bar%')
AND (f.fieldid = 1 AND f.data LIKE '%gah%')
ORDER BY c.name
第一个子句是日期比较,其余只是字符串搜索。
这将不会返回任何内容,因为有太多的 AND。我尝试使用 OR,但我基本上得到了每门课程,而不是我想要的课程(组合数据应该特定于一门课程)。
我查看了其他解决方案,一些人建议使用 IN 子句(即 fieldid in (2, 8, 4, 1))结合 GROUP BY(在 courseid 上)和 HAVING,但这对我的情况也没有帮助。
这是常见的EAV。
是正确的方法。但是你滥用了它。您必须检查 not
fieldid
, but(fieldid, f.data)
pair: