Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用left join获取用户';从mysql中的四个表中删除页面上的所有活动_Mysql_Sql_Foreign Keys - Fatal编程技术网

使用left join获取用户';从mysql中的四个表中删除页面上的所有活动

使用left join获取用户';从mysql中的四个表中删除页面上的所有活动,mysql,sql,foreign-keys,Mysql,Sql,Foreign Keys,请看一下这个(更新版) 假设我有用户的facebook idFB1111和产品型号CCC,我如何从使用外键的表bookmark和like_loke中检索用户对产品的喜欢/不喜欢和书签记录 表BOOKMARK存储用户单击产品页面上的书签按钮时在产品上的书签记录1表示他已将其添加到书签中,0表示他已取消对其进行标记,表中的LIKE\u TYPE字段也是如此 我对加入这么多表和where子句感到不知所措。LEFT JOIN是正确的方法吗 尽管Tom在ToyC上没有任何活动,但以下是我试图获得的输出:

请看一下这个(更新版)

假设我有用户的facebook id
FB1111
和产品型号
CCC
,我如何从使用外键的表
bookmark
like_loke
中检索用户对产品的喜欢/不喜欢和书签记录

BOOKMARK
存储用户单击产品页面上的书签按钮时在产品上的书签记录
1
表示他已将其添加到书签中,
0
表示他已取消对其进行标记,表
中的
LIKE\u TYPE
字段也是如此

我对加入这么多表和where子句感到不知所措。LEFT JOIN是正确的方法吗

尽管Tom在ToyC上没有任何活动,但以下是我试图获得的输出:

NAME   MODEL  ISBOOKED  LIKE_TYPE
TOM    ToyC   NULL      NULL
失败的尝试:

SELECT a.NAME,c.MODEL,b.ISBOOKED,d.LIKE_TYPE
  FROM `USER_ID` a 
         LEFT JOIN `BOOKMARK` b 
         ON b.USER_ID = a.USER_ID           
         LEFT JOIN `MODEL_ID` c
         ON c.MODEL_ID = b.MODEL_ID
         LEFT JOIN `LIKE_DISLIKE` d
         ON d.MODEL_ID = c.MODEL_ID
         WHERE a.FACEBOOK_ID = 'FB1111'
         AND c.MODEL_NUMBER = 'CCC'
         AND ( ?? OR ??)
这是表模式

CREATE TABLE BOOKMARK
    (`USER_ID` int, `MODEL_ID` int,`ISBOOKED`int)
;

INSERT INTO BOOKMARK
    (`USER_ID`,`MODEL_ID`,`ISBOOKED`)
VALUES
    (1, '2','1'),
    (2, '3','0'),
    (1, '1','1'),
    (2, '2','1')
;

CREATE TABLE LIKE_DISLIKE
    (`USER_ID` int,`MODEL_ID`int, `LIKE_TYPE` int)
;

INSERT INTO LIKE_DISLIKE
    (`USER_ID`,`MODEL_ID`,`LIKE_TYPE`)
VALUES
    (1, '1','0'),
    (2, '2','1'),
    (1,'2','1')
;


CREATE TABLE MODEL_ID
    (`MODEL_ID` int, `MODEL` varchar(20),`MODEL_NUMBER` varchar(20))
;

INSERT INTO MODEL_ID
    (`MODEL_ID`,`MODEL`,`MODEL_NUMBER`)
VALUES
    (1, 'ToyA','AAA'),
    (2, 'ToyB','BBB'),
    (3, 'ToyC','CCC')
;

CREATE TABLE USER_ID
    (`USER_ID` int, `NAME` varchar(20),`FACEBOOK_ID` varchar(20))
;

INSERT INTO USER_ID
    (`USER_ID`,`NAME`,`FACEBOOK_ID`)
VALUES
    (1, 'Tom','FB1111'),
    (2, 'Peter','FB2222')
;


ALTER TABLE BOOKMARK
ADD CONSTRAINT FK_bookmark_user_id
FOREIGN KEY (USER_ID) REFERENCES USER_ID(USER_ID) 
ON UPDATE CASCADE
ON DELETE CASCADE;

ALTER TABLE BOOKMARK
ADD CONSTRAINT FK_bookmark_model_id 
FOREIGN KEY (MODEL_ID) REFERENCES MODEL_ID(MODEL_ID) 
ON UPDATE CASCADE
ON DELETE CASCADE;

ALTER TABLE LIKE_DISLIKE
ADD CONSTRAINT FK_like_type_user_id
FOREIGN KEY (USER_ID) REFERENCES USER_ID(USER_ID) 
ON UPDATE CASCADE
ON DELETE CASCADE;

ALTER TABLE LIKE_DISLIKE
ADD CONSTRAINT FK_like_type_model_id 
FOREIGN KEY (MODEL_ID) REFERENCES MODEL_ID(MODEL_ID) 
ON UPDATE CASCADE
ON DELETE CASCADE;

如果希望参数位于底部:

   SELECT ui.NAME,mi.MODEL,b.ISBOOKED,ld.LIKE_TYPE
     FROM `USER_ID` ui
     JOIN `MODEL_ID` mi
LEFT JOIN `BOOKMARK` b 
       ON b.USER_ID = ui.USER_ID
      AND b.MODEL_ID = mi.MODEL_ID         
LEFT JOIN `LIKE_DISLIKE` ld 
       ON ld.USER_ID = ui.USER_ID
      AND ld.MODEL_ID = mi.MODEL_ID 
    WHERE ui.FACEBOOK_ID = 'FB1111'
      AND mi.MODEL_NUMBER = 'CCC'
除此之外,我更喜欢:

   SELECT ui.NAME,mi.MODEL,b.ISBOOKED,ld.LIKE_TYPE
     FROM `USER_ID` ui
     JOIN `MODEL_ID` mi
       ON mi.MODEL_NUMBER = 'CCC'
LEFT JOIN `BOOKMARK` b 
       ON b.USER_ID = ui.USER_ID
      AND b.MODEL_ID = mi.MODEL_ID         
LEFT JOIN `LIKE_DISLIKE` ld 
       ON ld.USER_ID = ui.USER_ID
      AND ld.MODEL_ID = mi.MODEL_ID 
    WHERE ui.FACEBOOK_ID = 'FB1111'

您的问题的直接答案是将
c
表中的条件移动到
on
子句中。它正在将
左侧外部联接
转换为
内部联接

SELECT a.NAME,c.MODEL,b.ISBOOKED,d.LIKE_TYPE
FROM `USER_ID` a 
         LEFT JOIN `BOOKMARK` b 
         ON b.USER_ID = a.USER_ID           
         LEFT JOIN `MODEL_ID` c
         ON c.MODEL_ID = b.MODEL_ID AND c.MODEL_NUMBER = 'CCC'
         LEFT JOIN `LIKE_DISLIKE` d
         ON d.MODEL_ID = c.MODEL_ID
WHERE a.FACEBOOK_ID = 'FB1111';
但是,我怀疑当您对在多个表中有多行的用户运行此查询时,您不会喜欢结果。当这种情况发生时,再问另一个问题