请看一下这个Fiddle (已更新)
假设我有用户的facebook id FB1111
以及产品型号CCC
,如何从表BOOKMARK
中检索用户对产品的喜欢/不喜欢和书签记录和LIKE_DISLIKE
使用外键?
表BOOKMARK
当用户点击产品页面上的书签按钮时,存储用户对该产品的书签记录。 1
意味着他已将其添加为书签并且 0
表示他已取消书签,LIKE_TYPE
也是如此。表中的字段 LIKE_DISLIKE
我对连接这么多表和 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'
关于mysql - 使用left join从mysql的四个表中获取用户在页面上的所有事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25143404/