我有这个问题:
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
答案 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 |
答案 2 :(得分:0)
您只需在查询中添加其他约束即可。
SELECT
id,
store_id,
name
FROM
ads
WHERE
name regexp '^.*(Massa+.*effect+)|(Glutamina+.*Black+.*Belt+).*$'
AND store_id = 9;