我有三张表,分别是表格、字段和类型。
表单有多个字段。字段具有类型。
有42种类型(我发誓,这纯粹是巧合)。表单总是有42个字段。
现在,我显示一个biiig表,其中包含所有相关的表单和字段。在每个列的顶部,您可以筛选结果。
我的问题是我找不到一个“简单”的方法来过滤结果。
我成功实现这一点的唯一方法是进行子查询,如下所示:
(在本例中,我使用值“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个子查询。
我想有更好的办法,但我想不出来,我希望你能帮助我理解它!
谢谢!

最佳答案

您可以使用附加的

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

如果有更多字段要筛选,请为它们添加额外的JOINs,并将这些条件添加到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
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/

10-10 02:32