簡體   English   中英

MySQL,如何在一槍中基於另一個查詢的結果集進行選擇

[英]Mysql, how to select based on result set from another query in one shot

我有兩個表,首先將其稱為brand_table,其結構如下:

 <table> <tr> <th>brand_id</th> <th>brand_name</th> </tr> <tr> <td>1</td> <td>Honda</td> </tr> <tr> <td>2</td> <td>Ford</td> </tr> </table> 

另一個是user_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>
    ) 

現在,如果我想知道喜歡每個品牌的總用戶,那么我將必須分兩個階段進行,甚至需要在編程方面進行:

  • 首先,加載所有品牌並將其存儲在結果集中
  • 其次,迭代結果集並找出每個brand_id的總用戶

我想做的是在單個查詢中執行此操作。

誰能幫我嗎?

根據給定用戶的品牌列表中存在的給定品牌,將兩個表連接起來。 為此,我們可以使用FIND_IN_SET來搜索給定輸入的值的CSV列表。 作為FIND_IN_SET工作方式的一個示例, FIND_IN_SET('1', '1,2,3')將返回索引1,因為1作為CSV列表中的第一個值出現。 FIND_IN_SET在沒有匹配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

演示在這里:

右旋酯

使用此查詢

select count(*) from user_table where FIND_IN_SET(<brand_id>,favorite_brands); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM