【问题标题】:JOIN across multi-query跨多个查询加入
【发布时间】:2015-12-07 06:33:08
【问题描述】:

如果我有一个多查询,例如:

SELECT * FROM my_database.`table` AS one
   WHERE one.some_field LIKE 'abc';
SELECT * FROM my_database.`table` AS two
    JOIN one
        ON one.id = two.relatedId;

是的。这些是相同的表,它们应该是。当然,它要复杂得多,但这个例子说明了重点。

然后我收到一个错误(使用 PHP 和 PDO),例如:

未找到基表或视图:1146 表“my_database.one”不存在

我可以通过这样做来规避这个错误:

CREATE TEMPORARY TABLE one AS
    (SELECT * FROM table AS one);
CREATE TEMPORARY TABLE two AS
    (SELECT * FROM table AS two
        JOIN one 
            ON one.id = two.relatedId
    );
SELECT * FROM one;
SELECT * FROM two;
DROP TEMPORARY TABLE one;
DROP TEMPORARY TABLE two;

我尝试在第一个查询和第二个查询之间使用 UNION,使其成为单个查询,但得到了同样的错误。而且我也不想使用 UNION。

是否有另一种不需要在此过程中显式创建临时表的方法?

注意:JOINing 子查询实际上是不可接受的,因为那时我必须编写相同的查询两次,一次用于选择它,一次用于加入它。

编辑:我想要两个查询的结果。第二个查询需要在第一个查询的结果集上加入。

【问题讨论】:

  • 为什么不在from 子句中使用`my_database.table AS one`?

标签: mysql join multi-query


【解决方案1】:

不确定你到底想做什么,你说加入子查询是不可接受的,但恐怕我不明白上下文但是这个怎么办:

SELECT
    *
FROM 
    (
        SELECT * FROM my_database.`table`
        WHERE some_field LIKE 'abc'
    ) AS `one`
    my_database.`table` AS two
WHERE
    one.id = two.relatedId;

对于您的特定问题,可能有更优雅的解决方案,但如果没有更多细节,就很难说。

正如 Gordon 在上面的 cmets 中所说,您也可以简单地加入表两次,而不使用子查询,并将两个表的条​​件放在 where 子句中,但再次没有更多上下文,我不确定您要做什么。

SELECT
    *
FROM 
    my_database.`table` AS `one`,
    my_database.`table` AS two
WHERE
    one.some_field LIKE 'abc'
    AND one.id = two.relatedId;

【讨论】:

    【解决方案2】:

    在你必须指定表的地方(一个或两个)

    SELECT one.*,two.* FROM my_database.`table`  one
      LEFT JOIN  my_database.`table` two
        ON one.id = two.relatedId
      WHERE one.some_field LIKE 'abc';
    

    【讨论】:

      【解决方案3】:

      获得所需结果的最简单方法是:

      SELECT * 
      FROM my_database.`table` two
          JOIN (
             SELECT * 
             FROM my_database.`table` 
             WHERE one.some_field LIKE 'abc';
          ) one
              ON one.id = two.relatedId
      

      但在我看来这很奇怪。你的真正目标是什么?为什么?

      【讨论】:

        猜你喜欢
        • 2013-08-06
        • 2022-07-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多