mysql php
データベーステーブル構造
製品テーブル製品
製品ID製品カタログ製品名
productid cids productname :
1. たとえば、製品ページに入り、URL を通じて製品 ID を取得する場合、製品 ID を通じて CID を取得する方法
次に、CIDS と同じコンテンツを持つ製品テーブルを見つけるためのステートメントを記述する必要があります。すべての製品
たとえば、URL を通じて productid 値が 1 である場合、cids 値は (1, 3, 4) になります。製品テーブル内で 1、3、または 4 を含むすべての製品を検索します。ディスカッションに返信します (解決策)
1、3、4 を配列に分割し、クエリを走査します。
リクエストにはいくつかの問題があります。まず、データベーステーブルの設計が完全に間違っています。クエリ結果を分割する必要があり、分割後も同様のクエリがまだある場合は、テーブルを再設計する必要があります。たとえば、各行に記録できる cid は 1 つだけです。
現在の操作を実行する必要がある場合は、2 つのステップで実行することをお勧めします。そうしないと、最初のステップは
select cids from product where productid = xxxx
です。たとえば、得られる結果は (1, 3, 4) です。 ) PHPでは配列に分割してデータベースでクエリします
select productid from product where ','+cids+',' like '%,1,%'unionselect productid from product where ','+cids+',' like '%,3,%'unionselect productid from product where ','+cids+',' like '%,4,%'
直接likeではありませんが、前後にカンマを付けているのは、12,13,14であればlike1が成功するからです
さらに、この書き込み方法は、テーブルが大きい場合、フルテーブルスキャンになるため非常に遅くなります。そのため、テーブル構造を変更することをお勧めします。
select productid, productnamefrom product where find_in_set((select cids from product where productid = '$productid'), cids)
テストされていない場合は、まず $productid に基づいて $cids をクエリし、次に $cids を使用して find_in_set 関数の最初のパラメータを置き換えます。
2階で述べたように、テーブルレコードが非常に大きい場合、テーブル構造を変更することをお勧めします。別のテーブルを使用して、productid と cid の対応関係を記録し、インデックスを作成します。
cids の両端の括弧を削除してください
つまり、(1,3,4) の形式を 1,3,4 の形式に変更します
次に、自己接続を使用し、find_in_set 関数を使用して、接続条件
find_in_set(T1.productid, T2.cids) および 2.productid=1 の製品 T1、製品 T2 から T1.* を選択