[英]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>
)
現在,如果我想知道喜歡每個品牌的總用戶,那么我將必須分兩個階段進行,甚至需要在編程方面進行:
我想做的是在單個查詢中執行此操作。
誰能幫我嗎?
根據給定用戶的品牌列表中存在的給定品牌,將兩個表連接起來。 為此,我們可以使用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.