如何引用列的查询值与存储值?

时间:2017-09-01 20:00:46

标签: mysql sql

我为标题道歉,我找不到一个好方法来说出我的问题。我对SQL很新。

基本上,我正在创建这个表(ids实际上引用了学生表,但我在这里简化了它):

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声明。假设我运行了这个INSERT查询:

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

这应该存储学生001跟随学生002。

我需要选择跟随者(002)并检查他们是否跟随学生(001)。为此,我需要检查具有student_id = followee_id的用户的关注者表(例如student_id = 002),然后检查该用户(002)是否跟随原始student_id(001)。

问题是我不知道如何引用INSERT查询中指定的student_id与引用SELECT查询中的值。

然后,如果两个学生互相跟随,那么我需要将followback设置为1。

希望这是有道理的,我在解释这个问题时非常困难。

1 个答案:

答案 0 :(得分: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 |
+------------+-------------+-------------+

这称为异常,因为当您尝试将相同的事实存储在两个地方时,这两行可能会相互矛盾。

我们也可以尝试制作一个更新原始行的触发器:

在追随者之后创建TRIGGER followback_ins 对于每一行   UPDATE粉丝AS f1 JOIN粉丝AS f2     ON f1.student_id = f2.followee_id AND 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列。如果您想知道它们是否相互关联,您必须将两行连接在一起:

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.