我有 3 个表格,分别是表单、字段和类型。 一个表单有多个字段。字段有类型。
共有 42 种类型(我发誓这纯粹是巧合)。表单总是有 42 个字段。
现在,我显示一个包含所有关联表单和字段的大表。在每列的顶部,您可以过滤结果。
我的问题是我找不到过滤结果的“简单”方法。
我设法实现此目的的唯一方法是创建子查询,如下所示:
(在此示例中,我正在使用值“secret”过滤 Type.id = 169)
SELECT a.id as fId, f.value, f.type_id
FROM `Form` a
LEFT JOIN Field f ON a.id = f.form_id
WHERE (
SELECT `value` FROM Field f2 WHERE f2.form_id = a.id AND f2.type_id = 169
) = 'secret'
ORDER BY a.date DESC
这很极端,因为对于我添加的每个过滤器,我都有一个子查询。因此,10 个过滤器 = 10 个子查询。
我认为有更好的方法来做到这一点,但我无法弄清楚,我希望你能帮助我理解它!
谢谢!
最佳答案
您可以使用额外的JOIN
SELECT a.id as fId, f.value, f.type_id
FROM `Form` a
LEFT JOIN Field f ON a.id = f.form_id
JOIN Field f2 ON f2.form_id = a.id
WHERE f2.type_id = 169
AND f2.value = 'secret'
ORDER BY a.date DESC
如果您有更多要过滤的字段,请为它们添加额外的 JOIN
,并将这些条件添加到 WHERE
子句中:
SELECT a.id as fId, f.value, f.type_id
FROM `Form` a
LEFT JOIN Field f ON a.id = f.form_id
JOIN Field f2 ON f2.form_id = a.id
JOIN Field f3 ON f3.form_id = a.id
WHERE f2.type_id = 169
AND f2.value = 'secret'
AND f3.type_id = 55
AND f3.value = 'blah'
ORDER BY a.date DESC
创建查询的脚本可以根据搜索条件将每个查询添加到循环中。
关于mysql - 使用左连接条件过滤主实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27617799/