2017-09-01 18 views
1

私はタイトルを謝罪し、私は自分の質問を語る良い方法を見つけることができませんでした。私はSQLについて非常に新しいです。列のクエリ値と格納された値を参照する方法は?

基本的に、私は(IDは、実際に学生テーブルを参照するが、私はここでそれを簡略化しました)この表を作成しています:

CREATE TABLE followers (student_id  int not null, 
         followee_id  int not null, 
         followsback  boolean, 
         PRIMARY KEY(student_id, followee_id) 
         SET followsback = IF(SELECT from followers 
          WHERE student_id = followee_id AND 
          followee_id = student_id, 1, 0) 

私の問題は、IF文です。 001(これは、学生002私はフォロイー(002)を選択する必要が

次された学生001を保存して、彼らは学生に従っているかどうかを確認することになっている

INSERT into followers(student_id, followee_id) values(001,002) 

:私はこのINSERTクエリを実行したと言います)戻る。これを行うには、student_id = followee_id(例:student_id = 002)のユーザーのフォロワーテーブルを確認し、そのユーザー(002)が元のstudent_id(001)をフォローしているかどうかを確認する必要があります。

問題は、INSERTクエリで指定されたstudent_idを参照する方法と、SELECTクエリ内の値を参照する方法がわかりません。

次に、2人の学生の場合は互いに以下の通りです、私は1

にfollowsback設定する必要がうまくいけば、これは理にかなって、私はこれを説明する途方もなく苦労しています。

答えて

1

表示する内容を行うための構文はMySQLのCREATE TABLE文にはありません。この機能を実装するSQLデータベースが市場には存在しないことを除いて、「アサーション」と呼ばれるSQL仕様のまれな機能によって実行できます。

あなたはトリガーとしてそれを実装しようとすることができます:

CREATE TRIGGER followback_ins BEFORE INSERT ON followers 
FOR EACH ROW 
    SET NEW.followsback = EXISTS (
     SELECT * from followers 
     WHERE student_id = NEW.followee_id AND followee_id = NEW.student_id); 

しかし、これは問題があります。元のレコードではなく、新しいレコードのフォローバックのみを更新します。

mysql> insert into followers set student_id = 123, followee_id = 456; 
mysql> insert into followers set student_id = 456, followee_id = 123; 

mysql> select * from followers; 
+------------+-------------+-------------+ 
| student_id | followee_id | followsback | 
+------------+-------------+-------------+ 
|  123 |   456 |   0 | 
|  456 |   123 |   1 | 
+------------+-------------+-------------+ 

あなたは2つの場所で同じ事実を保存しようとすると、これら2つの行が互いに矛盾することができますので、これは異常と呼ばれています。

我々はあまりにも元の行を更新トリガーを作成しようとすることができます:f1はf1.student_id ON F2 = F2と信者を結合として

がEACH ROW UPDATEフォロワーFORフォロワー ON INSERT、AFTERトリガfollowback_insを作成します。 followee_idおよびf1.followee_id = f2.student_id SET f1.followsback = true、f2.followsback = true;

しかし、これは違法です。同じテーブルのトリガからテーブルを更新することはできません(無限再帰のリスクが非常に高くなります)。

ERROR 1442 (HY000): Can't update table 'followers' in stored function/trigger 
because it is already used by statement which invoked this stored 
function/trigger. 

followsbackを保存することを忘れてしまいます。代わりに、次の関係をfollowsback列のない2つの行として保存してください。あれば何の相互以下が存在しない場合

SELECT COUNT(*) 
FROM followers AS f1 JOIN followers AS f2 
    ON f1.student_id=f2.followee_id AND f1.followee_id=f2.student_id 
WHERE f1.student_id = 123 AND f1.followee_id = 456. 

このクエリは0を返し、2:あなたは、彼らがお互いに従うかどうかを知りたい場合は、2つの行を結合する必要があります。

関連する問題