按2列计数过滤MySQL查询

时间:2017-10-04 17:05:05

标签: mysql

我有这个问题:

select id, store_id, name from ads 
where name regexp '^.*(Massa+.*effect+)|(Glutamina+.*Black+.*Belt+).*$';

结果是:

 id | store_id | name
----|----------|-----------------
 94 |        9 | Massa effect
 96 |        9 | Glutamina black belt
131 |        1 | Glutamina black belt
143 |       55 | Massa effect

我需要一个查询,返回属于同一商店(store_id)的搜索过的两种产品(Massa效果和Glutamina黑带)。

在示例中,我希望结果为:

 id | store_id | name
----|----------|-----------------
 94 |        9 | Massa effect
 96 |        9 | Glutamina black belt

修改

我在这张桌子上的一些数据示例:

 id | store_id | name
----|----------|-----------------
  2 |        4 | iPhone
 91 |        9 | Sweet sweat
 94 |        9 | Massa effect
 96 |        9 | Glutamina black belt
102 |        9 | BCCA 2500
131 |        1 | Glutamina black belt
143 |       55 | Massa effect
147 |       55 | Massa Effect
200 |       77 | Hey
202 |       78 | Topster
206 |       55 | Massa X

3 个答案:

答案 0 :(得分:2)

我不是100%确定这是否是你想要的,但你可以尝试这样的事情:

SELECT id, store_id, name 
FROM ads
WHERE name regexp '^.*(Massa+.*effect+)|(Glutamina+.*Black+.*Belt+).*$'
    AND EXISTS(
        SELECT null FROM ads as a WHERE 
        name regexp 
        '^.*(Massa+.*effect+)|(Glutamina+.*Black+.*Belt+).*$'
       AND a.id != ads.id
       AND a.store_id = ads.store_id
);

我很抱歉格式化。 一般的想法是使用“exists”来检查表中是否有另一个具有相似属性的元素,但不是行本身。如果要确保名称不相同,可以在where子句a.name != ads.name

中添加另一个条件

答案 1 :(得分:1)

您可以将GROUP BY与HAVING COUNT(*)>结合使用1找到重复的store_id与REGEX结合。

<强>查询

SELECT
 *
FROM 
 ads 
WHERE 
 store_id IN (
  SELECT 
   store_id
  FROM ( 

    SELECT
      store_id
    FROM
      ads 
    WHERE
      name
    REGEXP '^.*(Massa+.*effect+)|(Glutamina+.*Black+.*Belt+).*$'
  ) 
    ads
  GROUP BY
    ads.store_id
  HAVING COUNT(*) > 1
)

<强>结果

| id | store_id |                 name |
|----|----------|----------------------|
| 94 |        9 |         Massa effect |
| 96 |        9 | Glutamina black belt |

demo http://www.sqlfiddle.com/#!9/b3ca8/9

修改

使用GROUP_CONCAT进行更新以获取搜索ID,然后使用FIND_IN_SET将它们重新连接到同一个表上

<强>查询

SELECT 
 ads.*
FROM ( 

  SELECT 
     store_id
   , GROUP_CONCAT(id) ids
  FROM ( 

    SELECT 
     *
    FROM (     
      SELECT
          id
        , store_id
      FROM
        ads 
      WHERE
        name
      REGEXP '^.*(Massa+.*effect+)|(Glutamina+.*Black+.*Belt+).*$'
    ) 
      ads
  ) 
   ads
  GROUP BY 
   store_id
  HAVING COUNT(*) > 1 
)
 ads_search
INNER JOIN 
 ads
ON
 FIND_IN_SET(id, ids)

<强>结果

| id | store_id |                 name |
|----|----------|----------------------|
| 94 |        9 |         Massa effect |
| 96 |        9 | Glutamina black belt |

demo http://www.sqlfiddle.com/#!9/b3ca8/22

答案 2 :(得分:0)

您只需在查询中添加其他约束即可。

SELECT
    id,
    store_id,
    name
FROM
    ads 
WHERE
    name regexp '^.*(Massa+.*effect+)|(Glutamina+.*Black+.*Belt+).*$'
    AND store_id = 9;