1

私は、candidate_id と keyword_id の 2 つのフィールドを持つテーブルを持っています。keyword_id が 5 と 6 のすべての候補者/candidate_id をリストする必要があります。誰か、このための単一の mysql クエリを書くのを手伝ってください。

4

3 に答える 3

1

2つ以上の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 に答える
1

正確に何が必要かははっきりしませんが、このクエリでは、特定のキーワードと少なくとも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 に答える
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 に答える