Mysql,如何一次性从另一个查询中选择结果集

时间:2017-09-27 10:20:22

标签: mysql sql optimization mariadb

我有两张桌子,首先让我们称之为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;
&#13;
&#13;

另一个是user_table,结构如下:

&#13;
&#13;
<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;
&#13;
&#13;

据推测,我可以通过以下方式了解喜欢特定品牌的用户数量:

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

现在,如果我想知道喜欢每个品牌的用户总数,那么我将分两个阶段进行,甚至在编程方面进行:

  • 首先,加载所有品牌并将其存储在结果集中
  • 其次,迭代到结果集中,找出每个brand_id的总用户数

我想要做的是在一个查询中执行此操作。

有人可以帮我吗?

2 个答案:

答案 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

在这里演示:

Rextester

答案 1 :(得分:0)

使用此查询

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