我有两张桌子,首先让我们称之为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>
&#13;
另一个是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>
&#13;
据推测,我可以通过以下方式了解喜欢特定品牌的用户数量:
select count(*)
from table_user
where favorite_brands like
(
SELECT concat('%', brand_id, '%')
from brand_table
where brand_id = <brand_id>
)
现在,如果我想知道喜欢每个品牌的用户总数,那么我将分两个阶段进行,甚至在编程方面进行:
我想要做的是在一个查询中执行此操作。
有人可以帮我吗?
答案 0 :(得分:2)
根据给定用户的品牌列表中的特定品牌加入两个表格。为此,我们可以使用FIND_IN_SET
来搜索给定输入的CSV值列表。作为FIND_IN_SET
如何工作的示例,FIND_IN_SET('1', '1,2,3')
将返回索引1,因为1
作为CSV列表中的第一个值出现。 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
在这里演示:
答案 1 :(得分:0)
使用此查询
select count(*) from user_table where FIND_IN_SET(<brand_id>,favorite_brands);