2011-09-27 12 views
1

私は、次のMySQL - 重複なしで2つのテーブルを結合するには?

hotels 
------ 
hotelID 
hotelName 

第二に、テーブルのような二つのテーブル

operators 
--------- 
opID 
opName 
opServices 
opHotelID 

簡単な説明があります:最初の表では、私は一意であるインクリメントIDを持っているホテルの多くを持っています。 2番目の表には、このホテルに追加のサービスを提供しているすべてのオペレーターが含まれています。ここのopIDもユニークですが、opHotelIDは複数のオペレータが存在することがあるため、複数回存在します。

は今、私が取得したいことは、次のとおりです。

私はHotelNameやホテルを提供し、すべての演算子を示します(オペレーターと呼ばれる)追加の列を取得したいです。

だから、結果はこれに代えて

123 - Hotel ABC - OP1,Op2,OP3 

...このようにする必要があり...

123 - Hotel ABC - OP1 
123 - HOtel ABC - OP2 
123 - Hotel ABC - OP3 

は、1つのSQLクエリまたはどのように解決するにはこれを行う方法はありますこの問題?私は現在、検索機能に取り組んでおり、現在、私は左の結合で単純なSELECTクエリを持っていますが、これはさらに多くの行を返します。検索で一意のHotelIDのみを表示し、異なる演算子を1つの列に結合する必要があります。

あなたが助け、良​​い一日を持っていてくれてありがとう...

さようなら WorldSignia

答えて

2

を使用することができますmany to many関係

+0

ありがとうございます。それは今働く:) –

+0

多分私は行を数えることができますか教えてくれますか?特に私はLIMITをクエリに追加します。このクエリが生成する最大行を取得するにはどうすればよいですか?単純なCOUNTは機能しません。 –

+0

私はカウントオプションのために私の答えを編集しました。内部結合を左結合で置き換える必要がありますので、オペレータのいないホテルが必要です。 – Arkh

0

あなたは、単純なリンクテーブルを持っている必要があり、これはホテル

に多くのオペレータのための多くの関係に多くを作成します。
operatorhotels 
--------- 
opID 
opHotelID 
+0

この余分なテーブルがあると、どのようにクエリが表示されるのでしょうか?ありがとうございました。 –

0

あなたのDBの設計を変更したくない場合は、このクエリを使用することができます

SELECT hotelID,hotelName,opName FROM hotels h 
INNER JOIN operators o ON h.hotelID = o.opHotelID 
GROUP BY h.hotelID,hotelName,opName 

そうでない場合は、あなたが試してみてくださいGROUP_CONCAT

+0

最初の答えよりも、このクエリを実行すると決して終わりはありません(私もLIMIT 10を追加しました)。どちらの表にも約100,000レコードあります。パフォーマンスが非常に悪いのか、問題がどこにあるのでしょうか? –

1

を結果のマッピングテーブルを作成するには、この1:あなたはオペレータの数を持っているしたい場合は、あなたが使用する必要があり

SELECT hotels.hotelID, 
hotels.hotelName, 
GROUP_CONCAT(operators.opName SEPARATOR ', ') AS opList 
FROM hotels 
INNER JOIN operators 
ON operators.opHotelID = hotels.hotelID 
GROUP BY(hotels.hotelID) 

演算子IDのCOUNTは次のようになります。

SELECT hotels.hotelID, 
hotels.hotelName, 
GROUP_CONCAT(operators.opName SEPARATOR ', ') AS opList, 
COUNT(operators.opID) AS nbOperatos 
FROM hotels 
LEFT JOIN operators 
ON operators.opHotelID = hotels.hotelID 
GROUP BY(hotels.hotelID) 
0

すでにGROUP_CONCATを使用してください提案する。クエリは次のとおりです。

SELECT h.hotelID, h.hotelName, GROUP_CONCAT(o.opName) 
FROM hotels h 
INNER JOIN operators o ON h.hotelID = o.opHotelID 
GROUP BY h.hotelID 
+0

ありがとうございます、このクエリが終了することはありません理由は何ですか? (私はdbサーバ上のmysqlクライアントでこれをテストしました) –

+0

mysqlを再起動するために必要なdbに関する他の問題がありました。今すぐGROUP_CONCATは正常に動作します。 –

関連する問題