0

DB にクエリを実行して、さまざまなテーブルから情報を抽出します。おそらくSQLの外部で使用できる許容可能な結果を​​得ることができました。私が得た結果は非常に非効率的であり、SQL に何らかの作業をさせる方法があるかどうか疑問に思っています。基本的に、データをより効率的にグループ化し、一部を破棄する必要があります。

現在のクエリの結果は、次のように簡略化できるテーブルになります。

product_id | person_id | person_type | person_address | other_column
         1 |      1001 |           1 |    999 Main St | info about product 1
         1 |      1245 |           0 |                | info about product 1
         1 |      5133 |           2 |     101 Sql St | info about product 1
         1 |      9191 |           0 |    1 Query Ave | info about product 1
         2 |      5451 |           1 |    40 Table Rd | info about product 2
         2 |      6610 |           0 |                | info about product 2

したいのですがGROUP BY product_id、別々person_idに保管しperson_addressperson_type=0ください。person_id次に、同じ を共有するすべてのアドレスを連結しますproduct_id。から値を 1 つだけ保持しother_columnます。上記の表に適用すると、次のようになります。

product_id | person_id | person_address |                        other_address | other_column
         1 |      1245 |                | 999 Main St; 101 Sql St; 1 Query Ave | info about product 1
         1 |      9191 |    1 Query Ave |              999 Main St; 101 Sql St | info about product 1
         2 |      6610 |                |                          40 Table Rd | info about product 2

--

または、2 番目に良い解決策は 次のGROUP BY product_idとおりperson_idです。結果は次の表のようになります。person_type=0product_idperson_addressother_column

product_id |  person_id |                       person_address | other_column
         1 | 1245; 9191 | 999 Main St; 101 Sql St; 1 Query Ave | info about product 1
         2 |       6610 |                          40 Table Rd | info about product 2

--

背景を説明するために、2 つの目的があります。1 つ目はother_column、不要な重複を抽出して破棄することです。文字情報なのでかなり重いです。2 番目の目的は、 を持っていない人のために位置情報を取得できるようにすることですperson_idperson_address

(似たような質問を探してみましたが、見つかりませんでした。)

4

1 に答える 1

0
select
    t1.product_id, t1.person_id,
    t1.person_address,
    group_concat(t2.person_address) as other_address
from Table1 as t1
    left outer join Table1 as t2 on
        t2.product_id = t1.product_id and t2.person_id <> t1.person_id
where t1.person_type = 0
group by t1.product_id, t1.person_id

sql fiddle demo

于 2013-09-29T09:15:07.533 に答える