Mysql - 在 "one to many" table 中搜索

Mysql - search in "one to many" table

我有 table "one to many" 结构 "id, user_id, skill"。用户可以拥有多项技能,例如 "mysql" 和 "php".

当有人想搜索具有 "php" 和 "mysql" 技能的用户时,应该在搜索表单中写 "php mysql"。

我做了一些 MYSQL 查询(条件):"... WHERE skill LIKE '%php%' AND skill LIKE '%mysql%'" 但它 return 什么都没有。

我该如何改进?

我也试过 "WHERE CONCAT_WS(' ', skill) LIKE '%php%' AND CONCAT_WS(' ', skill) LIKE '%mysql%'"。也return没什么。

感谢您的帮助!

使用条件聚合:

SELECT t1.id, t1.name
FROM users t1
INNER JOIN
(
    SELECT s.user_id
    FROM skills s
    GROUP BY s.user_id
    HAVING SUM(CASE WHEN s.skill LIKE '%php%' OR
                         s.skill LIKE '%mysql%' THEN 1 ELSE 0 END) >= 2
) t2
    ON t2.user_id = t1.id

内部查询查找同时具有PHPMySQL技能的用户,然后使用此结果过滤users table至return 只有符合此要求的名称。

我在查询中假设给定技能对给定用户只会出现一次。如果同一个技能可能对同一个用户多次出现,则需要稍微修改查询。

SQLFiddle

更新:

如果您的 skills table 可能多次列出给定用户的相同技能,您可以使用 DISTINCT:

忽略这些重复的条目
SELECT t1.id, t1.name
FROM users t1
INNER JOIN
(
    SELECT s.user_id
    FROM (SELECT DISTINCT user_id, skill FROM skills) s
    GROUP BY s.user_id
    HAVING SUM(CASE WHEN s.skill LIKE '%php%' OR s.skill LIKE '%mysql%' 
               OR s.skill LIKE '%javascript%' THEN 1 ELSE 0 END) >= 3
) t2
    ON t2.user_id = t1.id

注意在下面的 Fiddle 中,Mark 没有 出现在结果集中,因为尽管他 PHP 作为一项技能列出了两次,他没有 MySQL 或 JavaScript.

SQLFiddle

REGEXP 可能更有效,但您必须对其进行基准测试才能确定,例如

SELECT * from table where field REGEXP 'php|mysql';

For Ref.