【问题标题】:MySQL JOIN on an arbitrary number of tables with independent WHERE clauses具有独立 WHERE 子句的任意数量表上的 MySQL JOIN
【发布时间】:2012-07-09 23:49:54
【问题描述】:

我正在构建一个包含大量潜在输入的复杂搜索应用程序。每个输入都是可选的。我正在尝试以模块化方式构建查询。

假设我有两个不同的查询,每个查询都有独立的WHERE 条件:

SELECT * FROM t1 WHERE t1.c1 = x

SELECT * FROM t2 WHERE t2.c1 = y

我发现以下代码是有效的:

SELECT * FROM t1 INNER JOIN t2 ON t1.c2 = t2.c2 WHERE t1.c1= x AND t2.c1= y

但是,由于WHERE 条件最后组合在一起,因此很难以模块化方式实现这一点。所以,我尝试了这个:

SELECT * FROM t1 WHERE t1.c1 = x INNER JOIN ON t1.c2 = t2.c2 WHERE t2.c1 = y

但是,此代码无效。用独立的WHERE 子句连接任意数量的表的最佳方法是什么?

【问题讨论】:

    标签: mysql join where


    【解决方案1】:

    表之间的连接可以有条件地实现——并且where子句在末尾连接——就像这样:

    SELECT * 
    FROM t1 
      INNER JOIN t2 ON t1.c2 = t2.c2 
      INNER JOIN t3 ON t1.c3 = t3.c3  
      INNER JOIN t4 ON t1.c4 = t4.c4  
    WHERE t1.c1 = x 
      AND t2.c2 = y
      AND t3.c3 = z
      AND t4.c4 = a
    

    您可以根据用户选择的选项有条件地将其构建为字符串。

    虽然动态构建where 子句和joins 可能有效,但可能存在一些需要注意的陷阱。

    首先,连接仍然可能必须根据表连接在一起的自然方式自定义构建 - 例如,t3 可能只能连接到 t2 而不能连接到 t1where 子句也会有类似的问题。每个 where 子句都必须根据表中的列自定义构建。

    换句话说,这个问题不太可能完全概括。最后,您需要根据表的具体情况编写自定义 SQL。更糟糕的是,随着时间的推移,表会发生变化,SQL 也必须随之变化。如果您正在动态构建复杂的 SQL,您可能会遇到维护难题。

    此外,随着应用程序的增长,您可能希望针对每种组合调整 SQL 以优化查询。确保在构建时考虑到这一点。

    【讨论】:

    • 有用的东西。现在,我将并行构建JOINWHERE 子句。谢谢!
    【解决方案2】:

    在这种情况下,我在代码中动态构建 WHERE 子句。我不确定是否有更好的方法。

    请务必使用prepared statements(参数化查询)。构建不带参数的 WHERE 子句是 huge security issue

    【讨论】:

      猜你喜欢
      • 2016-05-01
      • 2017-04-04
      • 1970-01-01
      • 2011-07-06
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      相关资源
      最近更新 更多