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

标签 mysql sql conditional-statements

我有 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/

相关文章:

php - 尝试从数据库中的列中减去金额,显示所有帐户的金额

php - 从选择查询中检索日期数据

mysql - 团体串联记录

MySQL 查询 SELECT GREATEST int row VALUE between limits

Java/SQL 字符串操作使 "Foo".equals ("Bar???")

sql - SQL 中的大文本和图像

c# - 数据绑定(bind)到数据表或gridview时出错

linux - 循环直到在列表中选择

Javascript - 函数,缺少参数

python - 如何避免大量嵌套的 if-elif-else 条件语句来评估许多情况下的快速响应?