"Every derived table must have its own alias" 在复杂的 MySQL 查询中

"Every derived table must have its own alias" in complex MySQL query

我有一个或多或少复杂的 MySQL select 查询,它基本上是来自两个复杂 tables:

的连接的 select
 SELECT * 
  FROM 
     ( SELECT ProblemID
            , 10*POWER(COUNT(ProblemID), 2) AS TagsSignifikanz 
         FROM 
            ( SELECT ProblemID 
                FROM Problemtag 
               WHERE Tagtext = "Francois" 
               UNION 
                 ALL 
              SELECT ProblemID 
                FROM Problemtag 
               WHERE Tagtext = "Hollande"
            ) AS TagsSignifikanzTable 
        GROUP 
           BY ProblemID
     ) 
  JOIN 
     ( SELECT ProblemID
            , SUM(Einzelsignifikanz) AS Titelsignifikanz 
         FROM 
            ( SELECT ProblemID
                   , 1 AS Einzelsignifikanz 
                FROM Problem 
               WHERE Titel LIKE "%Francois%" 
               UNION 
                 ALL 
              SELECT ProblemID
                   , 1 AS Einzelsignifikanz 
                FROM Problem 
               WHERE Titel 
                LIKE "%Hollande%" 
               UNION 
                 ALL 
              SELECT ProblemID
                   , 4 AS Einzelsignifikanz 
                FROM Problem 
               WHERE Titel LIKE "%Francois Hollande%"
            ) AS TitelSignifikanzTable 
        GROUP 
           BY ProblemID
      ) AS TagsUndTitelSignifikanzTable 
     ON TagsSignifikanzQuery.ProblemID = TitelsignifikanzQuery.ProblemID;

我已经尝试了一段时间,但就是想不出应该在哪里插入派生的 table 的名字。谁能帮帮我?提前致谢!

编辑 - 解决方案,在 BK435 和 Drew 的帮助下:(参见第 7 行和最后 2 行)

SELECT * FROM (
    SELECT ProblemID, 10*POWER(COUNT(ProblemID), 2) AS TagsSignifikanz FROM (
        SELECT ProblemID FROM Problemtag WHERE Tagtext = "Francois" 
            UNION ALL 
        SELECT ProblemID FROM Problemtag WHERE Tagtext = "Hollande"
    ) AS TagsSignifikanzTable GROUP BY ProblemID
) As Alias1
JOIN (
    SELECT ProblemID, SUM(Einzelsignifikanz) AS Titelsignifikanz FROM (
        SELECT ProblemID, 1 AS Einzelsignifikanz FROM Problem WHERE Titel LIKE "%Francois%" 
            UNION ALL 
        SELECT ProblemID, 1 AS Einzelsignifikanz FROM Problem WHERE Titel LIKE "%Hollande%" 
            UNION ALL 
        SELECT ProblemID, 4 AS Einzelsignifikanz FROM Problem WHERE Titel LIKE "%Francois Hollande%"
    ) AS TitelSignifikanzTable GROUP BY ProblemID
) AS Alias2 
ON Alias1.ProblemID = Alias2.ProblemID;

您应该在 join 之前放置一个别名,因为您为内部 select 而不是外部 select...

添加了别名
SELECT * FROM (
    SELECT ProblemID, 10*POWER(COUNT(ProblemID), 2) AS TagsSignifikanz FROM (
        SELECT ProblemID FROM Problemtag WHERE Tagtext = "Francois" 
            UNION ALL 
        SELECT ProblemID FROM Problemtag WHERE Tagtext = "Hollande"
    ) AS TagsSignifikanzTable GROUP BY ProblemID
) As Alias1
JOIN (
    SELECT ProblemID, SUM(Einzelsignifikanz) AS Titelsignifikanz FROM (
        SELECT ProblemID, 1 AS Einzelsignifikanz FROM Problem WHERE Titel LIKE "%Francois%" 
            UNION ALL 
        SELECT ProblemID, 1 AS Einzelsignifikanz FROM Problem WHERE Titel LIKE "%Hollande%" 
            UNION ALL 
        SELECT ProblemID, 4 AS Einzelsignifikanz FROM Problem WHERE Titel LIKE "%Francois Hollande%"
    ) AS TitelSignifikanzTable GROUP BY ProblemID
) 
AS TagsUndTitelSignifikanzTable ON TagsSignifikanzQuery.ProblemID = TitelsignifikanzQuery.ProblemID;

首先考虑这个(根据您对@BK435 的评论,您已删除):

create table t1
(   id int auto_increment primary key,
    stuff1 varchar(100) not null,
    stuff2 varchar(100) not null
);
insert t1 (stuff1,stuff2) values ('111.1','111.2'),('111.3','111.4'),('111.5','111.6');

create table t2
(   id int auto_increment primary key,
    stuff1 varchar(100) not null,
    stuff2 varchar(100) not null
);
insert t2 (stuff1,stuff2) values ('222.1','222.2'),('222.3','222.4'),('222.5','222.6');

select * 
from t1 
join t2 
on t2.id=t1.id;
+----+--------+--------+----+--------+--------+
| id | stuff1 | stuff2 | id | stuff1 | stuff2 |
+----+--------+--------+----+--------+--------+
|  1 | 111.1  | 111.2  |  1 | 222.1  | 222.2  |
|  2 | 111.3  | 111.4  |  2 | 222.3  | 222.4  |
|  3 | 111.5  | 111.6  |  3 | 222.5  | 222.6  |
+----+--------+--------+----+--------+--------+

select * 发生的事情是它从两个 table 的连接中获取所有内容。它是真实的 table 还是带有别名的派生 table 并不重要。

我在两个 table 中也有相同的列名,以显示没有使用列别名的问题。下面将解决这个问题:

select t1.id,
t1.stuff1 as 1stuff1,t1.stuff2 as 1stuff2,t2.stuff1 as 2stuff1,t2.stuff2 as 2stuff2 
from t1 
join t2 
on t2.id=t1.id;

+----+---------+---------+---------+---------+
| id | 1stuff1 | 1stuff2 | 2stuff1 | 2stuff2 |
+----+---------+---------+---------+---------+
|  1 | 111.1   | 111.2   | 222.1   | 222.2   |
|  2 | 111.3   | 111.4   | 222.3   | 222.4   |
|  3 | 111.5   | 111.6   | 222.5   | 222.6   |
+----+---------+---------+---------+---------+

现在回到 BK435 所做的。它给第一个派生的 table 一个别名,所以你得到了那个错误,它启发了我们 TagsSignifikanzQuery 从左字段中出来,未知,并在那里导致错误的错误。

假设 BK 首先运行此程序,结果为空白 tables:

create table problemtag
(   problemid int not null,
    tagtext varchar(100) not null
);

create table problem
(   problemid int not null,
    Einzelsignifikanz int not null,
    titel varchar(100) not null
);

然后运行他的查询。这是错误:

Error Code: 1054. Unknown column 'TagsSignifikanzQuery.ProblemID' in 'on clause'

因此,当您加入 a、b、c、d 等(真实的或派生的 table)时,它会依靠 on clause 将您正在工作的那个加入其中如果你愿意的话,与已经在连接折叠中的(真实的或派生的)table 有某种关系。但是 TagsSignifikanzQuery 不是。这就像有人把希腊语放在英语句子的末尾。数据库引擎就像 'huh?'

编辑(以说明您在上面 Pink/Peach 中的最后一个错误)

create table t1
(   id int auto_increment primary key,
    stuff1 varchar(50) not null
);
insert t1 (stuff1) values ('111.1'),('111.2'),('111.3');

create table t2
(   id int auto_increment primary key,
    stuff2 varchar(50) not null
);
insert t2 (stuff2) values ('222.1'),('222.2'),('222.3');

create table t3
(   id int auto_increment primary key,
    stuff3 varchar(50) not null
);
insert t3 (stuff3) values ('333.1'),('333.2'),('333.3');

A1:显式加入

select t1.id,t1.stuff1,t2.stuff2 
from t1 
join t2 
on t2.id=t1.id;
+----+--------+--------+
| id | stuff1 | stuff2 |
+----+--------+--------+
|  1 | 111.1  | 222.1  |
|  2 | 111.2  | 222.2  |
|  3 | 111.3  | 222.3  |
+----+--------+--------+

A2:和你一样的错误(错误:1054

select t1.id,t1.stuff1,t2.stuff2 
from t1 
join t2 
on t3.id=t1.id;
+----+--------+--------+
| id | stuff1 | stuff2 |
+----+--------+--------+
|  1 | 111.1  | 222.1  |
|  2 | 111.2  | 222.2  |
|  3 | 111.3  | 222.3  |
+----+--------+--------+

错误 1054 (42S22):'on clause'

中的未知列 't3.id'

为什么我的错误和你的一样?因为在我的例子中,select/join 不知道我在说什么 t3,因为它唯一介绍的是 t1 和 t2,我什至还没有完成 t2 的 on clause .我正在引用 t3(它作为 table 存在)。

您很可能有一个 TagSignifikanzQuery table。但这就像我在连接上下文中的 t3 一样。也就是说,数据库引擎没有被正确输入。您需要完成引入 t2 的 on clause。然后,如果需要,继续加入 TagsSignifikanzQuery。

但是写错了

编辑2:


在您的评论中:

... 在查询 "SELECT * FROM Table1 JOIN Table2" 中不需要 AS 子句,尽管我会说你 select 数据来自以前不存在的连接 table,我。 e.派生table。但是 MySQL 错误变为 "a derived table always needs an alias" 左右,但它似乎不适用于加入的 tables。诚然,一个别名在一个joined table 中是没有必要的,但错误似乎是一个错误的声明。或者加入的 tables 不被认为是派生的 tables? -- 来自 P.M.

德鲁回应:

在你从头到尾写的 "which was not there before" 中,从我的角度来看,它只是在它自己的上下文中,与任何其他代码片段无关,或者该代码已被修改一些其他状态未显示,则 Table1 和 Table2 确实存在,否则连接将失败。对吧?

在你写的最后三分之一中,我会这样说:table 要么是真实的,要么是派生的。如果它是派生的,则需要一个名称,如 http://pastie.org/10379926 in lines 32 and 34 for an Answer I wrote up for this question: http://tinyurl.com/nhsmmyx

所示

在第 34 行,我不得不扑通一声 y。或者我可以说 "as y" 但我很懒。我会争辩说我什至根本不必做 "y",因为我最外层的 select 里面所有的东西只是最后的润色,只是应该懒洋洋地给我列整个内部并完成它。但是 mysql 给了我 "Error Code 1248: Every derived table must have its own alias" 如果我不这样做。

我在第 27 行做 "t"(或者我可以说 "as t")的原因是因为我很懒,会在第 33 行依赖它,太懒了” ... 和 thing1.theDate<=x.xDate".

希望对您有所帮助。