0

基本的に2つの複雑なテーブルの結合からの選択である多かれ少なかれ複雑な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

これを最初に検討してください(削除した@ 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 * で何が起こるかというと、2 つのテーブルの結合からすべてを取得します。実際のテーブルであるか、別名を持つ派生テーブルであるかは問題ではありません。

また、列のエイリアスを作成しないという問題を示すために、両方のテーブルに同じ列名を付けました。以下はそれを修正します:

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そうではありません。誰かが英文の最後にギリシャ語を入れたようなものです。そして、dbエンジンは「え?」のようなものです。

編集(上記のピンク/ピーチの最後のエラーを説明するため)

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: 明示的な Join

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: あなたのようなエラー ( Error: 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' が不明です

なぜ私のエラーとあなたのエラーが同じなのですか? 私の場合、select/join は t3 で何を話しているのかわかりません。導入されたのは t1 と t2 だけであり、on clauset2 についてはまだ完了していません。そして、t3 (テーブルとして存在する) を参照しています。

あなたは、TagsSignifikanzQuery テーブルを持っている可能性が非常に高いです。しかし、それは結合コンテキストでの私の t3 と同じです。つまり、db エンジンに正しく供給されていません。on clauset2の持ち込みを終了する必要があります。次に、必要に応じて TagsSignifikanzQuery への参加を続行します。

しかし、書かれているようにエラーになります。

編集2:


あなたがコメントに書いたことで:

...クエリ「SELECT * FROM Table1 JOIN Table2」では、AS句は必要ありませんが、以前は存在しなかった結合テーブル、つまり派生テーブルからデータを選択すると思います。しかし、MySQL エラーは「派生テーブルには常にエイリアスが必要です」などになりますが、結合されたテーブルには適用されないようです。確かに、結合されたテーブルではエイリアスは必要ありませんが、エラーは間違ったステートメントを作成しているようです。または、結合されたテーブルは派生テーブルとは見なされませんか? -- 午後から

ドリューの反応:

あなたが最初から「以前はなかった」という言葉まで書いたもので、私の読書の角度から、それ自体の文脈では他のコードとは関係がないか、またはそのコードが他の状態で変更された場所表示されていない場合、Table1 と Table2 が存在しない場合、結合は失敗します。右?

あなたが書いたものの最後の 3 分の 1 で、私はこう言います: テーブルは実数または派生物のいずれかです。派生した場合は、名前が必要です。http://pastie.org/10379926の 32 行目と 34 行目にあるように、この質問に対して私が書いた回答の場合: http://tinyurl.com/nhsmmyx

34 行目で、y をプロップする必要がありました。または、「as y」とも言えますが、私は怠け者です。内部にあるすべての外部マウスの選択は単なる仕上げであり、内部全体の列を怠惰に与えて完了させる必要があるため、「y」をまったく実行する必要さえないと主張しますそれ。しかし、そうでない場合、mysqlは「エラーコード1248:すべての派生テーブルには独自のエイリアスが必要です」というメッセージを表示します。

27 行目で "t" を実行した (または "as t" と言うことができた) 理由は、私が怠け者であり、33 行目でそれを頼りにするためです。"... and thing1.theDate< =x.xDate".

これが役立つことを願っています。

于 2015-08-25T23:36:55.383 に答える