2011-11-16 15 views
0

2つのテーブルを結合し、各アイテムごとに1つの行を取得しようとしています。レーティングのデフォルト値は45です。カテゴリ内に異なるレーティングがあるたびに、各アイテムの行が複製されます。以下に、スキーマ、データ、および結果の例を示します。SQL JOIN行を複製する

表1
-------------------------- ofid
|アイテム|カテゴリ
--------------------------
1 |アイテム1 | cat1
2 |アイテム2 | cat1
3 | item3 | CAT1

表2
---------------------------
ofid |評価|カテゴリ
---------------------------
1 | 37 | cat1
2 | 42 | cat1
3 | 45 | CAT1

結果
------------------------------------
ofid |アイテム|評価|カテゴリ
------------------------------------
1 |アイテム1 | 37 | cat1
1 |アイテム1 | 42 | cat1
1 |アイテム1 | 45 | cat1
2 |アイテム2 | 37 | cat1
2 |アイテム2 | 42 | cat1
2 |アイテム2 | 45 | cat1
3 | item3 | 37 | cat1
3 | item3 | 42 | cat1
3 | item3 | 45 | CAT1

期待される結果
------------------------------------
ofid |アイテム|評価
------------------------------------
1 |アイテム1 | 37
2 |アイテム2 | 42
3 | item3 | 45

問合せ:
SELECT p.ofid,p.item,r.rating FROM table1 AS p INNER JOIN table2 AS r ON p.category = r.category WHERE p.category = "cat1" GROUP BY p.ofid,p.category,r.rating

は、私は、JOIN、LEFT JOINを、RIGHT ....助けを登録しよう、DISTINCT追加しようとしましたか?

ありがとうございます。

+0

select文では3つの列しか選択されていないが、 "期待される結果"には4つの列があることに注意してください。私はこれがタイプミスだと思う。 – larsks

+0

かなり正確です。編集されました。キャッチをありがとう。 – zero742

答えて

0

これは、選択している3つのフィールドすべてをグループ化しているので、完全に正常な結果です。結果セット内の各ofidの単一コピーが必要な場合は、GROUP BY p.ofidのみを実行します。

+0

私もそれを試みました。実際には正しい数の行が得られますが、3つの評価すべてで45となります。 – zero742

+0

それも期待されています。あなたは何を評価したいですか?そのofidのすべての評価の平均? 'select avg(p.ofid)... ' –

2

あなたが期待している結果によると、間違ったフィールドに参加していると思います。以下は動作するはずです。

Select 
    p.ofid, 
    p.item, 
    r.rating 
From table1 p 
Inner Join table2 r On r.ofid = p.ofid 
where p.category ="cat1" 
+0

Correctomundo !!!!私はちょうど完全にあまりにも長くこれを見ていたと思う。名誉! – zero742

1

おそらく私は誤解していますが、あなたもアイデンティティに参加したいですか?

SELECT p.ofid,p.item,r.rating 
FROM table1 AS p 
INNER JOIN table2 AS r 
    ON p.category = r.category AND p.ofid = r.ofid 
WHERE p.category = "cat1" 
GROUP BY p.ofid,p.category,r.rating 
0

あなたは、おそらく他にofidに参加したい(またはその代わりに?)categorytable1の3つのエントリはすべて"cat1"であり、table2の3つのエントリはすべて"cat1"であるため、table1の各レコードはtable2の3つのレコードすべてと一致します。したがって、3×3 = 9行が結果として期待される。あなたはおそらくこのようなものが欲しいでしょう:

SELECT p.ofid,p.item,r.rating 
FROM table1 AS p 
INNER JOIN table2 AS r ON p.category = r.category 
         AND p.ofid = r.ofid 
WHERE p.category = "cat1" 
GROUP BY p.ofid,p.category,r.rating 
0

私はこれがあなたがやろうとしていることだと思いますか?

SELECT p.offid,p.item,r.rating,r.category FROM table1 p INNER JOIN table2 r 
ON p.category = r.category 
AND p.offid = r.offid 
WHERE p.category = 'cat1'