結果として行 ID 1 と 3 を返すクエリを教えてもらえますか?
ID Name Hidden
1 Mika 1,4,2
2 Loca 0
3 Nosta 4
4 Like 2
この SELECT * FROM table WHERE Hidden HAVING(4) のようなもの
SELECT * FROM table WHERE FIND_IN_SET('4',Hidden);
FIND_IN_SETのドキュメント
SELECT * FROM table WHERE CONCAT(',',Hidden,',') LIKE '%,4,%'
または、このように LIKE の使用を避けることができます
SELECT * FROM table WHERE INSTR(CONCAT(',',Hidden,','), ',4,') > 0
これは 40、14 などを取得しませんが、Hidden フィールドにスペースがないことを確認する必要があります (たとえば、1, 4, 5
concat と LIKE 関数を適宜更新します。
また、テーブルを正規化し、適切な列にインデックスを持つ別のテーブルにこれらの「隠された」値を格納することを検討することもできます。あなたが持っている行の数に応じて、それははるかに高速になります:
ID Hidden
1 1
1 4
1 2
3 4
4 2
と:
SELECT DISTINCT table.* FROM table, hidden_table WHERE table.ID = hidden_table.ID AND hidden_table.hidden = 4
SELECT * FROM table WHERE Hidden LIKE '%4%'
% はワイルドカードです。
提案されているように、全文検索を使用するか、または
非表示の値を、現在の行の ID を持つ別のテーブルにスピンオフします。
たとえば、Mika はこのテーブルに 3 つのエントリを持ちます。
ID = 1、隠し =1
ID = 1、隠し =4
ID = 1、隠し =2
次に、このスピン オフ テーブルに対して結果を返すことができます。
正しい単語区切りを使用している限り、全文検索が妥当な解決策になる可能性があります。