2016-11-08 17 views
-1

in_storesの列を持つ 'offer'という名前のテーブルがあります。それは、このオファーが利用可能である店舗のIDが含まれているグラフィカルこのテーブルは次のようになります。SQLを使用して配列内の文字列を検索

id | title | in_stores 
1 | Shoes | 1002,1003 
2 | Gloves | 1020,1011 
3 | Shades | 1002,1009 
4 | Hats  | 1010,1002 
5 | Shoes | 1220 
6 | Shirts | 1010 
7 | Hats  | 1002 

in_storesの各値は、PHPによるimplode()機能で保存されます。

私の質問: がどのように単一mysqliクエリでクエリは、ID 1,3,4,7との申し出を返す必要があります。この例では、ID 1002と店舗で利用可能なすべてのオファーを選択します。私はexplode()のようなものをまず配列内の結果を得るために使い、in_array()より特定のidを検索するべきだと思うが、これらの関数はすべてSQL内で利用できない。

+7

http://stackoverflow.com/questions/3653462/is-storing-a-delimited-list-in-a-database-column-really-that-bad/3653574 – e4c5

+0

検索する必要があるカンマ区切りの値は次のとおりです。非常に悪い考えです。この問題を避けるためにデザインを変更するのは時期尚早ですか? – PaulF

答えて

1

これはカンマ区切りのフィールドを格納する際の大きな問題です。

MySQLにはこれらを検索する機能があり、これはLIKEを使用するよりも信頼性が高くなります。しかし、それでも効果的にインデックスを使用することはできないため、速くはありません。

SELECT * 
FROM offers 
WHERE FIND_IN_SET('1002', in_stores) 

はるかに優れた各idの各値の行と余分なテーブルを使用するようにデータベースを再設計します。

+0

私は物事をする良い方法を理解しています。好奇心の念から、この関数は、9999より大きい数字を持つ 'LIKE'を使うときとは違って、いつも好きなように動作しますか?遅いのにもかかわらず?フィールドを配列としてキャッチし、それを検索しますか? –

+1

どのようにカバーの下で動作するかわかりませんが、コンマ区切りリストで値を確実に見つけるように設計されています。一般的な問題は、リストがカンマで区切られていない場合、またはカンマとスペースを使用している場合に発生します。 http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_find-in-set – Kickstart

+0

うん。しかし、私の場合は、コンマ区切りの値を厳密に使用し、スペースを追加する方法はありません。私は正しい答えとしてあなたに答えています。それは私が尋ねたものに対する正確な答えですから。 –

-1

私はあなたがMySQL LIKEオペレータを使用していると思います。クエリで指定された文字列をデータベース列で検索します。

は、この文字列で検索してください:

$sql = "SELECT * FROM offers WHERE in_store LIKE '%1002%'"; 

以上説明については、このリンクをチェックしてください:W3Schools - SQL LIKE Operator

私はそれがトリックを行うべきだと思います。

0

クエリはLIKEクエリで実行できますが、これはお勧めできません。

SELECT * FROM offers WHERE in_stores LIKE "%1002%"

9999より大きい値が設定されていない限り、これは機能します。 BUT1100299991002の店舗である場合、これらの不要な値も返されます。

あなたがするべきことは、あなたのmysqlテーブルを変換することです。storeLocationsまたはsthです。 else。これにはプロパティーoffer_idstore_idのみが必要です。あなたはデータを挿入するとき今、あなたのように破を使用しますが、storeLocationsにできるだけ多くの行を挿入する必要はありませんそして、あなたは

SELECT * FROM offers AS o 
    LEFT JOIN storeLocations as l ON (o.id=l.offer_id) 
    WHERE l.store_id = 1002; 

のように、そこから選択することができ

`offers` 
id | title 
1 | Shoes  
2 | Gloves 
3 | Shades 
4 | Hats  
5 | Shoes 
6 | Shirts 
7 | Hats  

`storeLocations` 
offer_id, store_id 
1  | 1002 
1  | 1003 
2  | 1020 
2  | 1011 
3  | 1002 
3  | 1009 
4  | 1010 
4  | 1002 
5  | 1220 
6  | 1010 
7  | 1002 

: それはにあなたのデータを変換しますその特定のアイテムのstore_idがあります。

このトピックの詳細については、hereをご覧ください。

関連する問題