使用左连接条件过滤主实体

时间:2014-12-23 09:45:41

标签: mysql sql conditional-statements

我有3个表表单字段类型。 表单有多个字段。字段具有类型。

有42种类型(纯粹的巧合,我发誓)。表单始终有42个字段。

所以,现在,我显示一个biiig表,其中包含所有相关的表单和字段。在每列的顶部,您可以过滤结果。

我的问题是我找不到一种过滤结果的“简单”方式。

我设法实现这一目标的唯一方法是制作子查询,如下所示:
(在这个例子中,我在Type.id = 169上过滤,值为“secret”)

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个子查询。

我认为有更好的方法可以做到这一点,但我无法理解,我希望你能帮助我理解它!

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以使用其他JOIN s

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

创建查询的脚本可以根据搜索条件在循环中添加每个查询。