0

我有一个或多或少复杂的 MySQL 选择查询,它基本上是从两个复杂表的连接中选择的:

 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;

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

编辑 - 在 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;
4

2 回答 2

1

您应该在连接之前放置一个别名,因为您为内部选择而不是外部选择...

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;
于 2015-08-25T22:50:07.657 回答
1

首先考虑这一点(根据您对 @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 * 发生的事情是它从两个表的连接中获取所有信息。它是真实表还是带有别名的派生表都没有关系。

我在两个表中也有相同的列名,以显示不做列别名的问题。下面将解决这个问题:

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做了什么。它为第一个派生表提供了别名,因此您可以解决该错误,并且它会启发我们TagsSignifikanzQuery来自左侧字段的错误,未知,并在那里导致错误。

因此,假设 BK 首先使用空白表运行它,结果是:

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
);

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

错误代码:1054。“on 子句”中的未知列“TagsSignifikanzQuery.ProblemID”

因此,当您加入 a、b、c、d 等(真实或派生表)时,它依赖on clause于将您正在工作的表带入折叠中,因为它与(真实或派生)表有某种关系如果您愿意,已经在加入折叠中。但TagsSignifikanzQuery不是。这就像有人在英语句子的末尾加入了希腊语。数据库引擎就像“嗯?”

编辑(以说明您在上面的 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 子句”中的未知列“t3.id”

为什么我的和你的错误是一样的?因为在我的情况下,选择/加入不知道我在说什么 t3,因为它被引入的唯一东西是 t1 和 t2,我什至还没有完成on clausefor t2。我正在引用 t3 (以表格形式存在)。

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

但它写的错误。

编辑2:


在您在评论中写的内容中:

...在查询“SELECT * FROM Table1 JOIN Table2”中,不需要 AS 子句,尽管我会说您从以前不存在的连接表(即派生表)中选择数据。但是 MySQL 错误是“派生表总是需要别名”左右,但它似乎不适用于连接表。诚然,连接表中不需要别名,但该错误似乎做出了错误的陈述。还是连接表不被视为派生表?——来自下午

德鲁回应:

在您从一开始就通过“以前不存在”一词所写的内容中,从我的角度来看,仅在其自身的上下文中与任何其他代码无关,或者该代码已在其他状态下被修改未显示,则 Table1 和 Table2 确实存在,否则连接将失败。正确的?

在你写的最后三分之一,我想说:一张表要么是真实的,要么是派生的。如果它是派生的,则需要一个名称,如http://pastie.org/10379926第 32 行和第 34 行中所示,我为这个问题写了一个答案:http: //tinyurl.com/nhsmmyx

在第 34 行我不得不扑通一声 y。或者我可以说“as y”,但我很懒。我会争辩说我根本不应该做“y”,因为我对里面所有东西的最外层选择只是最后的润色,应该懒洋洋地给我整个内部的列并完成它。但是如果我不这样做,mysql会给我“错误代码1248:每个派生表都必须有自己的别名”。

我在第 27 行做“t”(或者我可以说“as t”)的原因是因为我很懒,并且会在第 33 行依靠它,懒得在那里做“......和thing1.theDate< =x.x 日期”。

我希望这有帮助。

于 2015-08-25T23:36:55.383 回答