Mysql - 搜索"一对多"表

时间:2016-07-18 06:49:36

标签: mysql sql select one-to-many

我有桌子和#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%'"之类的东西。它也没有任何回报。

感谢您的帮助!

2 个答案:

答案 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

内部查询查找同时拥有PHPMySQL技能的用户,然后使用此结果过滤users表,仅返回符合此要求的名称。

我在我的查询中假设给定技能将对给定用户出现一次且仅出现一次。如果同一技能可能会多次出现在同一个用户身上,则需要略微修改查询。

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UISegmentedControl_Class/index.html#//apple_ref/doc/uid/TP40006807-CH3-SW33

<强>更新

如果您的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。

SQLFiddle

答案 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');  
      }
    }
  }
}

For Ref.