みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

結合で重複のエラーが出る

mysql5.1.33を使用しています。
次のような構成で、

テーブル「tbl1s」
id int(11)

テーブル「tbl2s」
id int(11)

テーブル「tbl1s_tbl2s」
id int(11)
tbl1_id int(11) tbl1sの外部キー
tbl2_id int(11) tbl2sの外部キー

テーブル「tbl2sbelongs」
id int(11)
tbl2_id int(11) tbl2sの外部キー
count int(11)

テーブル「tbl1s」
+------+
|  id  |
+------+
|  1  |
+------+
|  2  |
+------+
|  3  |
+------+

テーブル「tbl2s」
+------+
|  id  |
+------+
|  1  |
+------+
|  2  |
+------+
|  3  |
+------+

テーブル「tbl1s_tbl2s」
+------+-------+-------+
|  id  | tbl1_id | tbl2_id |
+------+-------+-------+
|  1  | 1    | 1   |
+------+-------+------+
|  2  | 1    | 2   |
+------+-------+------+
|  3  | 3    | 3   |
+------+-------+------+

テーブル「tbl2sbelongs」
+------+-------+-------+
|  id  | tbl2_id | count |
+------+-------+-------+
|  1  | 1    | 3   |
+------+-------+------+
|  2  | 2    | 10  |
+------+-------+------+
|  3  | 3    | 15  |
+------+-------+------+

SELECT * FROM `tbl1s_tbl2s` AS `Tbl1sTbl2` INNER JOIN (SELECT *, sum(Tbl2sbelong.`count`) as sum FROM `tbl2s` AS `Tbl2` INNER JOIN `tbl2sbelongs` AS `Tbl2sbelong` ON (`Tbl2`.`id`=`Tbl2sbelong`.`tbl2_id`) WHERE 1 = 1 GROUP BY `Tbl2`.`id` ) AS `SUB` ON (`Tbl1sTbl2`.`tbl2_id`=`SUB`.`id`) WHERE 1 = 1 GROUP BY `tbl1_id`
を実行すると、
「SQL Error: 1060: Duplicate column name 'id' 」
というエラーが出てしまいます・・・
おそらくカラムのidが結合の中で重複しているという内容だと思うのですが、
3つもテーブルが絡んでくるとどれのidがというのが分からないのですが、
これは何が原因なのでしょうか?
ちなみにサブクエリの
SELECT *, sum(Tbl2sbelong.`count`) as sum FROM `tbl2s` AS `Tbl2` INNER JOIN `tbl2sbelongs` AS `Tbl2sbelong` ON (`Tbl2`.`id`=`Tbl2sbelong`.`tbl2_id`) WHERE 1 = 1 GROUP BY `Tbl2`.`id`
この段階までは実行できます。

最終的には、「tbl2sbelongs」テーブルの「count」の値によって、「tbl1s」を降順に並べ替えたいと思っています。
この例だと
テーブル「tbl1s」
+------+
|  id  |
+------+
|  3  |count = tbl2_id「3」の15 = 15
+------+
|  1  |count = tbl2_id「1」の3 + tbl2_id「2」の10 = 13
+------+
|  2  |count = 0
+------+

投稿日時 - 2009-12-11 01:03:25

QNo.5513576

すぐに回答ほしいです

質問者が選んだベストアンサー

こういうものは順序だてて考えればそんなに難しいものではありません。

(1)tbl1単位でcountを集計
SELECT tbl1_id,SUM(count) AS count
FROM tbl1s_tbl2s
INNER JOIN tbl2sbelongs USING(tbl2_id)
GROUP BY tbl1_id

(2)これをtbl1にLEFT JOIN
SELECT id
FROM tbl1s
LEFT JOIN (
SELECT tbl1_id,SUM(count) AS count
FROM tbl1s_tbl2s
INNER JOIN tbl2sbelongs USING(tbl2_id)
GROUP BY tbl1_id
) AS SUB
ON tbl1s.id=tbl1_id
ORDER BY count DESC

投稿日時 - 2009-12-11 09:33:54

お礼

ご回答ありがとうございます。
そのやり方でできました。ありがとうございます。
質問ではtbl2sテーブルをJOINに絡めてましたが、後で気づいたのですがこれは必要なかったですね・・・
tbl2sbelongsテーブルとtbl1s_tbl2sで直接JOINできたんですね。

その後、
「SQL Error: 1060: Duplicate column name 'id' 」
のエラーが
SELECT tbl1_id,SUM(count)

SELECT *,SUM(count)
にしていたことが原因だったことが分かったのですが、
ということはINNER JOIN の段階(サブクエリの段階)では「*」でもエラーにならなかったってことは
次のLEFT JOINが原因なのかと思ってこちらもINNER JOINに変えたのですが、同じエラーでした・・・
「*」にidも含まれてるからだとは思うのですが、これは一体どういうエラーなのでしょうか?
サブクエリの段階(SELECT *, SUM(count) as count FROM `tbl1s_tbl2s` AS `Tbl1sTbl2` INNER JOIN `tbl2sbelongs` AS `Tbl2sbelong` ON (`Tbl1sTbl2`.`tbl2_id`=`Tbl2sbelong`.`tbl2_id`) WHERE 1 = 1 GROUP BY `tbl1_id`)
ではtbl1s_tbl2s、tbl2sbelongs両方とも同じ名前のカラム「id」を所有していてもエラーが起きないのですが、
なぜ次のLEFT JOINした段階ではエラーが起こるのでしょうか?

投稿日時 - 2009-12-11 17:09:08

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

>なぜ次のLEFT JOINした段階ではエラーが起こるのでしょうか?

ようは*を使うとエラーが検証しにくいということです。
きちんとコーディングする場合は*はまず使いません。
実際に個別に*の内容をみるとidが二つあったりするし、それを
結合するときに競合がでているように見受けられます

投稿日時 - 2009-12-11 18:26:22

お礼

ご回答ありがとうございます。
つまり、はじめの2つの重複カラム(id)はmysql側でなんとか処理してくれるけど、
3つ目以降はエラーになるという認識でいいのでしょうか?
とりあえず「*」は使わず取り出すように心がけることで対処していきたいと思います。

投稿日時 - 2009-12-11 21:38:25

あなたにオススメの質問