通过搜索标签组合查找ID

时间:2012-10-12 09:24:37

标签: php mysql sql join

我有一个包含两个字段candidate_id和keyword_id的表。我需要列出所有具有keyword_id 5和6的候选人/ candidate_id。有人请帮我写一个单独的mysql查询。

3 个答案:

答案 0 :(得分:1)

目前还不清楚你究竟想要什么,但是这个查询为你提供了至少与给定关键字匹配的所有候选人(使用LIKE搜索关键字中的匹配项。如果给出关键字'php'并且关键字在你的数据库是'php programmer',这个匹配会出现)。像这样的东西应该可以解决问题,如果这是你所追求的。

  $sQueryExtension = '';
  foreach($keywords as $keyword) {
    $sQueryExtension .= " OR `keyword` LIKE '%$keyword%'";
  }
  $sQueryExtension = substr($sQueryExtension, 3); // skip first OR

  $sQuery = "
    SELECT candidate.* 
    FROM candidate, match_table 
    WHERE candidate.id = match_table.candidate_id 
    AND match_table.keyword_id IN (
      SELECT * FROM keyword WHERE $sQueryExtension
    );";

答案 1 :(得分:1)

一个很容易适应两个以上关键字_id的选项就是......

SELECT
  candidate_id
FROM
  yourTable
WHERE
  keyword_id IN (1,2)
GROUP BY
  candidate_id
HAVING
  COUNT(DISTINCT keyword_id) = 2

另一种选择可能是......

SELECT
  k1.candidate_id
FROM
  yourTable  AS k1
INNER JOIN
  yourTable  AS k2
    ON k1.candidate_id = k2.candidate_id
WHERE
      k1.keyword_id = 1
  AND k2.keyword_id = 2

但是,应该注意的是,这两个选项都没有很好地扩展(因为你增加了候选人,关键词和你搜索的关键词数量。

如何处理这种糟糕的扩展完全取决于您的数据和您的需求。在SO答案中讨论的主题过于宽泛和主观。

答案 2 :(得分:0)

你需要有记录吗? 1. 5或6 OR 2.你是否需要同时拥有5和6的候选人?

对于案例1,

SELECT candidate_id
FROM <table>
WHERE keyword_id in (5,6);

对于案例2,

SELECT candidate_id
FROM (SELECT candidate_id, count(distinct keyword_id)
      FROM <table>
      WHERE keyword_id in (5, 6)
      GROUP BY candidate_id
      HAVING COUNT(DISTINCT keyword_id) > 1);