1

我有一个包含两个字段候选 ID 和关键字 ID 的表。我需要列出所有具有关键字 ID 5 和 6 的候选人/候选人 ID。请有人帮我为此编写一个 mysql 查询。

4

3 回答 3

1

尚不清楚您到底想要什么,但是此查询为您提供了与给定关键字至少匹配一次的所有候选人(使用 LIKE 搜索关键字中的匹配项。如果给出关键字“php”并且您的数据库中的关键字是'php 程序员',这个匹配会出现)。如果这是你所追求的,这样的事情应该可以解决问题。

  $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
    );";
于 2012-10-12T09:34:35.397 回答
1

一个易于适应两个以上keyword_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 答案中讨论的主题过于广泛和主观。

于 2012-10-12T09:53:58.557 回答
0

您是否需要具有 1. 5 或 6 或 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);
于 2012-10-12T11:44:51.280 回答