我有桌子和#34;一对多"结构" id,user_id,skill"。用户可以拥有多种技能,例如" mysql"和" php"。
当有人想用技能搜索用户时#34; php"和" mysql"应该用搜索表单" php mysql"来写。
我做了一些MYSQL查询(条件):"... WHERE skill LIKE '%php%' AND skill LIKE '%mysql%'"
但它什么也没有返回。
我该如何改进?
我也试过"WHERE CONCAT_WS(' ', skill) LIKE '%php%' AND CONCAT_WS(' ', skill) LIKE '%mysql%'"
之类的东西。它也没有任何回报。
感谢您的帮助!
答案 0 :(得分:1)
使用条件聚合:
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
表,仅返回符合此要求的名称。
我在我的查询中假设给定技能将对给定用户出现一次且仅出现一次。如果同一技能可能会多次出现在同一个用户身上,则需要略微修改查询。
<强>更新强>
如果您的skills
表可能多次为给定用户列出相同的技能,则可以使用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
在下面的小提琴中注意,Mark在结果集中出现 not ,因为虽然他将PHP作为两次列出的技能,但他没有MySQL或JavaScript。
答案 1 :(得分:0)
REGEXP可能更有效率,但您必须对其进行基准测试,例如。
window.onload = function () {
var images = document.getElementsByTagName('img');
for( var i=0; i<images.length;i++){
if (images[i].naturalWidth > images[i].naturalHeight) {
$(images[i]).addClass('landscape');
}
else{
if(images[i].naturalWidth < images[i].naturalHeight) {
$(images[i]).addClass('portrait');
}
}
}
}