2016-08-19 8 views
-4
Table example: 
id - registro - valor 
1 - compras - 1,2,6 
2 - ventas - 3,4 
3 - deudas - 5 
4 - Something - 13,14,15,16,10 

私はこのテーブルをデータベースに持っています。私は3番だけを送る照会をしたい、そして私は2番のレジスタを持って来る。この例では。それはできます。 INプローブとINプローブは、CONTAINSで試してみましたが、どちらもしませんでした。私はする必要があります...ヘルプ返される複数のカンマ区切りの値を含むレコードphp mysql

+3

'find_in_set'はあなたの友人です。しかし、あなたはdbデザインについて考えるべきです。値をCSVとして保存すると非常に悪いdbデザインです – Jens

+0

私はcsvとしてデータを保存していません。カンマをセパレータとして使用して配列を文字列に変換する場合のみです。以上です.. –

答えて

1

@Jensは言うように、この目的のためにthe FIND_IN_SET() functionを使用することができます。

SELECT registro 
    FROM tbl 
WHERE FIND_IN_SET('3', valor) > 0 

@Jens氏によると、これはデータベース設計が貧弱なことです。行の特定の列に複数の値を格納すると、RDMSシステムに組み込まれている多くの最適化が無効になります。

次の2つのテーブルを持つ方が良いと思います。そして、あなたのようなクエリを使用することができます

マスター

master_id - registro 
1  - compras 
2  - ventas 
3  - deudas 
4  - Something 

詳細(通知はここで一つだけvalor行当たりがあります)

master_id - valor 
    1  - 1 
    1  - 2 
    1  - 6 
    2  - 3 
    3  - 4 
    etc. 

この

SELECT master.registro 
    FROM detail 
    JOIN master ON master.master_id = detail.master_id 
    WHERE detail.valor = 3 

このようにテーブルを正規化すると、余分な作業がたくさんあるように見えます。しかし、アプリケーションの規模が大きくなると、このようにすると数千倍も高速になります。真剣に。

関連する問題