MySQLで値がn個一致(n個以上一致)(n個以下一致)しているレコードの取得

これ以外とありそうで、いままでやってなかったのでメモ。

+--------------+---------------------+------+-----+---------+----------------+
| Field        | Type                | Null | Key | Default | Extra          |
+--------------+---------------------+------+-----+---------+----------------+
| id           | bigint(16) unsigned | NO   | PRI | NULL    | auto_increment |
| user_id      | bigint(16) unsigned | NO   |     | NULL    |                |
| a_1          | bigint(16) unsigned | YES  |     | NULL    |                |
| a_2          | bigint(16) unsigned | YES  |     | NULL    |                |
| a_3          | bigint(16) unsigned | YES  |     | NULL    |                |
| created_on   | datetime            | NO   |     | NULL    |                |
+--------------+---------------------+------+-----+---------+----------------+
id,user_id,a1,a2,a3

上みたいなテーブルa_1,a_2,a_3は、それぞれanswerの番号(回答番号)が入ってるイメージ。
で、あるユーザーとすべての回答が一致しているレコードの取得であれば簡単に取れますが、
あるユーザーと3個中2個同じレコードってなると、OR OR OR みたいなの書きたくなるところで、、

SELECT 10 = 10;
+---------+
| 10 = 10 |
+---------+
|       1 |
+---------+

MySQLで、10=10を取得すると1が取れる。
つまり比較した場合の結果が0,1で返るんですね。

ってのを使って、、

SELECT other.user_id FROM answer AS self
  INNER JOIN answer AS other ON self.user_id != other.user_id
  WHERE
    self.user_id = 100 AND 
  ( (self.a1 = other.a1 ) + (self.a2 = other.a2 ) + (self.a2 = other.a2 ) ) = 2;

自分(user_id=100)と、回答が2つ同じ人のuser_idを取得したい場合はこんな感じで。
それぞれの回答を比較して、合計が2になればどれか2個が一致してる。
あとは>=2でも、<=2でもすればいいんじゃないかと。

返信を残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください