mysql - 使用left join从mysql的四个表中获取用户在页面上的所有事件

标签 mysql sql foreign-keys

请看一下这个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/

相关文章:

php - 当一个字段可以为空时,对两个字段进行 SQL JOIN

MySQL 加入了 WHERE IN 与 NOT IN 结合(类别)

postgresql - 删除主键索引

mysql - 简化 SQL 中的时间线 (Netezza)

mysql - 从mysql表中删除重复行(稍微复杂)

php - 如果数据库表中存在值,请选中复选框

mysql - MySQL中基于表内容的动态正则表达式

sql - SSIS 平面文件源高级编辑器,有没有办法一次更改所有数据类型?

SQL表主键设置

MySQL::Edge Case::混合类型外键::可能还是做梦?