MySQLで値がn個一致(n個以上一致)(n個以下一致)しているレコードの取得
2014年2月7日
これ以外とありそうで、いままでやってなかったのでメモ。
+--------------+---------------------+------+-----+---------+----------------+ | 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でもすればいいんじゃないかと。