0

店舗を表すデータベースには、次のテーブルがあります。

table name: 
  CLIENTS_PRODUCTS
columns:
  client_id (INT)
  product_name (CHAR(256))

ご覧のとおり、各製品の購入はテーブルにレコードとして保存されます。

クライアントAが与えられた場合、Aの積(pA)とXの積(pX)があり、pAがpXの接頭辞であるすべてのクライアントXを見つけたいと思います。

簡単に言うと、同じテーブル内の異なるレコード間で比較を実行する必要があります。JOINCLIENTS_PRODUCTS 自体を ing することでそれを行うことを考えました。これは正しい方法ですか?

私はSOで検索しましたが、これに対する直接的な答えは見つかりませんでした。

4

2 に答える 2

0

この構造はあなたが達成しようとしていることを助長しているようには見えませんが、REGEXP 式を使用して機能するようにハックできると思います。テーブルのサイズによっては、これが遅くなる場合があります。

SELECT DISTINCT prod_parents.client_id 
FROM CLIENTS_PRODUCTS AS products
JOIN CLIENTS_PRODUCTS AS prod_parents ON 
  prod_parents.product_names REGEXP CONCAT("^",products.product_names)
  #AND prod_parents.client_id <> products.client_id
WHERE products.client_id = ? AND products.product_names = ?

クライアント A に残りを返したくない場合は、JOIN の AND のコメントを外します。

別の方法として、parent_id をテーブルに追加し、product_names プレフィックスに一致する新しい行が挿入される場合、そのレコードの ID が parent_id として割り当てられます。アプリケーションは製品プレフィックスの正規表現を処理するため、データベースの負荷が軽減されます。上記の SP の JOIN ... ON products.id=prod_parents.parent_id を変更することにより、単純な整数比較が残されます。

于 2013-05-17T01:39:20.883 に答える