使用left join获取用户';从mysql中的四个表中删除页面上的所有活动
请看一下这个(更新版) 假设我有用户的facebook id使用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上没有任何活动,但以下是我试图获得的输出:
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';
但是,我怀疑当您对在多个表中有多行的用户运行此查询时,您不会喜欢结果。当这种情况发生时,再问另一个问题