2017-09-27 3 views
0

ショットuser_table、このような構造:MySQLは、私は2つのテーブルを持って、最初のはbrand_tableそれを呼ばせ、このような構造

<table> 
 
    <tr> 
 
    <th>user_id</th> 
 
    <th>username</th> 
 
    <th>favorite_brands</th> 
 
    </tr> 
 
    <tr> 
 
    <td>1</td> 
 
    <td>John Wick</td> 
 
    <td>1,2</td> 
 
    </tr> 
 
    <tr> 
 
    <td>2</td> 
 
    <td>Jack Reaper</td> 
 
    <td>2</td> 
 
    </tr> 
 
    <tr> 
 
    <td>2</td> 
 
    <td>Han Solo</td> 
 
    <td>1</td> 
 
    </tr> 
 
</table>

おそらく、私がすることによって、特定のブランドを好きどのくらいのユーザーが知ることができます。私はブランドのそれぞれが好きな総ユーザーを知りたい場合は、今すぐ

select count(*) 
    from table_user 
    where favorite_brands like 
    (
     SELECT concat('%', brand_id, '%') 
      from brand_table 
      where brand_id = <brand_id> 
    ) 

を、私はそれを行う必要がありますでも2つのフェーズとプログラミング側でそれを行う:

  • まず、結果にすべてのブランドや店舗、それらをロードするには、
  • 第二セット、結果セットに反復処理し、それぞれの総ユーザーを見つける
  • をbrand_id

私がやりたいことは、これを1つのクエリで実行することです。

誰でも教えてください。

+0

なぜ、テーブルに 'user_id 1'の2レコードの代わりに' favourite_brands'を '1,2'として、ユーザがお気に入りとして好きなブランドごとに1つの' user_id 1'レコードがありますか? – Nope

+1

ヒント: 'LIKE'の代わりに' FIND_IN_SET() 'を使用してください。 – sagi

+0

あなたは ''を持っているので、 'SELECT'を使わないでください!とにかく、あなたが '' LIKE '%1%' 'で終わると何が起きますか? - 間違った結果です。 –

答えて

2

特定のユーザーのブランドリストに存在する特定のブランドに基づいて2つのテーブルを結合します。この目的のために、FIND_IN_SETを使用して、指定された入力の値のCSVリストを検索できます。 FIND_IN_SETがどのように機能するかの例として、FIND_IN_SET('1', '1,2,3')は、1がCSVリストの最初の値として発生するため、インデックス1を返します。 FIND_IN_SETは、一致しないためにゼロを返します。したがって、ゼロ以外の値が返される限り、CSVに関心のある値が含まれていると見なすことができます。

SELECT 
    t1.brand_id, 
    t1.brand_name, 
    COUNT(t2.favorite_brands) AS cnt 
FROM brand_table t1 
LEFT JOIN user_table t2 
    ON FIND_IN_SET(t1.brand_id, t2.favorite_brands) > 0 
GROUP BY 
    t1.brand_id, 
    t1.brand_name 

出力:

brand_id brand_name cnt 
1 1   Honda  2 
2 2   Ford  2 

ここにデモ:

Rextester

+0

Nice回答Tim Biegeleisen –

0

select count(*) from user_table where FIND_IN_SET(<brand_id>,favorite_brands); 
このクエリを使用します
関連する問題