下記条件で、結果期待値を取得するSQLを知りたいです
検索値が含まれているレコードかつ、一致度が高い順に並び替えて取得
検索地が含まれていなくても問題なし
試したこと
select * from table where
(tag1 = 'A' or tag2 = 'A' or tag3 = 'A') AND
(tag1 = 'B' or tag2 = 'B' or tag3 = 'B') AND
(tag1 = 'C' or tag2 = 'C' or tag3 = 'C') AND
(tag1 = 'D' or tag2 = 'D' or tag3 = 'D')
上記SQLでは、A,B,C,Dすべて含まれているデータしか表示されないので満たせていません
select * from table where
(tag1 = 'A' or tag2 = 'A' or tag3 = 'A') OR
(tag1 = 'B' or tag2 = 'B' or tag3 = 'B') OR
(tag1 = 'C' or tag2 = 'C' or tag3 = 'C') OR
(tag1 = 'D' or tag2 = 'D' or tag3 = 'D')
上記SQLでは、検索値に含まれてないデータまで含まれていまいます
SQLアンチパターン
そもそもテーブル設計が悪いよ!というのは同意します
N:Nであれば中間テーブルを作るべきだということはわかっていますが
タグ(自由に決定できる)という性質上、難しいので、1テーブルで行いたいと考えています
検索値
A B C D
データベースのデータ
カラム | tag1 | tag2 | tag3 |
---|---|---|---|
レコード1 | A | B | C |
レコード2 | D | B | H |
レコード3 | E | F | G |
レコード4 | H | I | B |
結果期待値
カラム | tag1 | tag2 | tag3 |
---|---|---|---|
レコード1 | A | B | C |
レコード2 | D | B | H |
レコード3 | H | I | B |
どなたかご教授お願いいたします
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/07/02 05:52