0

私はlike、Facebook で見られる機能のような小さなことをしています。だから私がやっている方法はこのようなものです。products私は、人々ができる製品を含むというテーブルを持っていますlike。このように(剥ぎ取って):

id | prodName               | status (0=clear, 1=blocked)
----------------------------------------------------------
1  | Philips Food Processor | 0
2  | Le Sharp Knife         | 0
3  | Ye Cool Fridge         | 0

Then comes the `likes` table like this:
id | prodName               | prodId | userId
--------------------------------------------
1  | Philips Food Processor | 1      | 1
2  | Le Sharp Knife         | 2      | 1
3  | Ye Cool Fridge         | 3      | 1
4  | Ye Cool Fridge         | 3      | 2

テーブルに追加する前に、likesその ID を持つ製品が実際に製品テーブルに存在し、そのステータス = 0 であるかどうかを確認する必要があります。現在、多くの php コードでこれを行っています。SQLを使用してこれを行うにはどうすればよいでしょうか? 出来ますか?外部キーなどを使用していますか?

私はinnodbテーブルタイプを使用しています。

4

6 に答える 6

2

条件付きを行うことができますinsert。製品 6 とユーザー 7 の場合:

insert  into Likes
        (prodName, prodId, userId)
select  prodName
,       id
,       7
from    Products
where   id = 6
        and status = 0

これで行が挿入されない場合は、商品がステータス 0 で存在しなかったことがわかります。

于 2013-05-08T13:11:01.123 に答える
0

insertルールに従って theを表現したいだけの場合は、次のように使用できinsert . . . selectます。

insert into likes(prodId, userId)
    select <prodid>, <userid>
    from products p
    where p.prodid = <prodid> and status = 0

MySQL は、フラグに要件を含めることもできる「部分的な」外部キー制約をサポートしているとは思わない。

likesまた、製品名をテーブルに入れるべきではありません。表で調べるべきですproducts

于 2013-05-08T13:11:27.397 に答える
0

product テーブルに存在しないものを likes テーブルに追加しようとする際の重要な要素は、それが間違っていることをユーザーに知らせるフィードバックです。あなたが決定した答えは、基本的にPHPコードを必要とするユーザーフィードバックの側面を無視すべきではありません.

ただし、はい - 外部キーを介してそれを行う方法があります。2 番目のテーブルの prodid にインデックスを付け、それを最初の table.id への外部キーとして参照できます。これは、挿入しようとしてエラーが発生した場合、最初のテーブルに一致しないものを追加しようとしていることが問題である可能性があることを意味します。

ただし、エラーが何であるかを正確に判断して、そのエラーに対応するための適切なロジックを決定しようとすると、独自の大量の php コードが発生し、将来の開発者が維持するのが容易ではなくなります。Product オブジェクトの単純なメソッドをお勧めします: isValid( id )true/false を返すため、「これを確認する」コードは単純に進みますif( Product.isValid( prodId ) ){ Like.insert( userId, prodId ); }

しかし同時に、データベースがリンクされていない行で雑然とすることに対する保険として、おそらくすでに使用しているphpコードとともに外部キー制約を強くお勧めします. 通常は、不良データに対して複数のバリアを設けることが最善です。

さらに...製品名をproductテーブルとlikesテーブルの両方に保存している理由はありますか? 好きなテーブルでそれが必要な理由がわかりません。

于 2013-05-08T13:11:41.073 に答える
0
--Check to see if cleared product exist in products table
Select count(*) from products p where p.status = 0 and p.id = %IDVALUE

--Check if your user previous liked product
Select count(*) from products p, likes l where p.id = l.prodId and l.userId = %USERID

コードでステートメントを実行し (%IDVALUE と %USERID を実際の値に置き換えます)、戻り列をチェックしてカウントを取得し、カスタム ロジックを実行できます。

于 2013-05-08T13:13:55.217 に答える
0

現在、like テーブルにデータを入力するには prodId が必要なので、ブロックに関する制約に関係なく、データを検索する必要があります。したがって:

INSERT INTO likes (prodname, prodId, userId)
SELECT prodname, id, 123456
FROM products
WHERE prodname='Le Sharp Knife'
AND status=0;

(必要なパラメータを 123456 と 'Le Sharp Knife' に置き換えてください)。

于 2013-05-08T13:14:18.600 に答える
-1

データベースにクエリを実行してレコードを確認する必要があります。

たとえば、製品IDは次のとおりです2。クエリは次のようになります

$query = select * from 'your-like-table' where 'prodId ' = 'ID';

それから

if ( !mysql_query('your-db',$query)):

この状態になったら、データベースにいいねを入力する時です

endif;

それが役に立てば幸い

于 2013-05-08T13:10:34.433 に答える