2017-05-02 3 views
0

私は3つのテーブルを持っています。 1つはクライアントのデータを持つメインテーブル、1つはビジネスタイプリスト、3つ目はクライアントのIDと関連するすべてのビジネスとの関係です。mysqlのプライマリテーブルから1つのクエリでリレーションテーブルの値を連結する方法

クライアントテーブル、すなわちClients

id | client | address | phone 
---------------------------------- 
1 | John Doe | Address1 | Phone 1 
2 | Jane Doe | Address2 | Phone 2 
3 | Jack Doe | Address3 | Phone 3 

企業タイプテーブル、すなわちBusinesses

id | business 
----------------- 
1 | Electrician 
2 | Plumber 
3 | Home remodel 
4 | Bathrooms 

そして、関係テーブルには、すなわちRelations、どのビジネスに関連付けられているクライアントと言って:

c_id | b_id 
----------- 
1 | 3 
1 | 4 
2 | 2 
2 | 4 
3 | 1 
3 | 2 
3 | 4 

私はちょうどconcaが必要ですtenated事業名は、このように、各クライアントのために一列に選択される:

結果:

id | client | address | phone | business 
-------------------------------------------------------------------- 
1 | John Doe | Address1 | Phone 1 | Home remodel, Bathrooms 
2 | Jane Doe | Address2 | Phone 2 | Plumber, Bathrooms 
3 | Jack Doe | Address3 | Phone 3 | Electrician, Plumber, Bathrooms 

は、単一のクエリを使用していることは可能ですか?私は多くのconcatとgroup_concatメソッドを試しましたが失敗しました。私は本当に任意のアイデアを感謝します。

答えて

1

はい。外部結合を使用し、GROUP_CONCAT集約とGROUP BY節を使用します。

このような何か:

SELECT c.id 
    , c.client 
    , c.address 
    , c.phone 
    , GROUP_CONCAT(b.business ORDER BY b.id) AS business 
    FROM `Clients` c 
    LEFT 
    JOIN `Relations` r 
    ON r.c_id = c.id 
    LEFT 
    JOIN `Businesses` b 
    ON b.id = r.b_id 
GROUP 
    BY c.id 
    , c.client 
    , c.address 
    , c.phone 
+0

ような何かああ、私も内側のクエリでは、クライアント、住所、電話でグループ化された可能性があります。ありがとう! – Utsav

+0

これは動作していますが、非常にゆっくりです。私のクライアントテーブルは> 500k行を持ち、ビジネスは約600です。イベントをクライアントに限定してwhere句を4つの結果に制限すると、2番目、2番目、5番目の半分になります。何かが最適化されていませんが、結果は間違いなく適切です。 –

+0

起こるかどうかわかりません。私は実際にはIDだけでグループ化しています。この例よりも多くの列があり、idだけが関係しており、索引付けされています。 –

0

select * from client 
inner join 
(
select c.id,group_concat(b.business separator ',') as business 
from cleints c 
inner join relation r 
on c.id=r.c_id 
inner join business 
on r.b_id=b.id 
group by c.id) c1 
on c.id=c1.id 
+0

最後の行にエラーがあります... c.idが未定義ですが、c.idの代わりに角括弧の外側にあります。いずれの場合でも結果を出すことはありませんが、試してみてください –

関連する問題