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
内部查询查找同时具有PHP
和MySQL
技能的用户,然后使用此结果过滤users
table至return 只有符合此要求的名称。
我在查询中假设给定技能对给定用户只会出现一次。如果同一个技能可能对同一个用户多次出现,则需要稍微修改查询。
更新:
如果您的 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.
REGEXP 可能更有效,但您必须对其进行基准测试才能确定,例如
SELECT * from table where field REGEXP 'php|mysql';
我有 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
内部查询查找同时具有PHP
和MySQL
技能的用户,然后使用此结果过滤users
table至return 只有符合此要求的名称。
我在查询中假设给定技能对给定用户只会出现一次。如果同一个技能可能对同一个用户多次出现,则需要稍微修改查询。
更新:
如果您的 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.
REGEXP 可能更有效,但您必须对其进行基准测试才能确定,例如
SELECT * from table where field REGEXP 'php|mysql';