mysql完全连接无法正常工作

时间:2015-10-04 16:55:04

标签: mysql

我使用以下mysql来查看用户订阅。我需要让所有用户在一个列中显示他们是否有有效订阅

这就是我的尝试:

fob = open("Exercise.txt", "r")
def read_from_file(filename): 
    raw_txt = filename.read()
    rtxt = raw_txt.replace('\n', '')
    triplets = [rtxt[i:i+3] for i in range(0, len(rtxt), 3)]
    print triplets
read_from_file(fob)

问题是它只返回有订阅的用户。我需要它来返回所有用户,并在列中显示是否有订阅

我该怎么做?

2 个答案:

答案 0 :(得分:1)

您的where条款正在将left join转变为inner join。此外,表别名将使查询更容易编写和阅读:

SELECT e.`email`, substring_index(e.`name`, ' ', 1) as name, cs.`expiryTimestamp`  
FROM `general`.`exchange` e LEFT JOIN
     `courses`.`courseSubscriptions` cs
     ON cs.`memberID` = e.`id` AND (cs.expiryTimestamp > 1443975741) ;

LEFT JOIN问题的解决方案是将 second 表上的条件移动到ON子句中。此外,您无需重复连接条件。

如果您想要一个标志,可以添加:

SELECT e.`email`, substring_index(e.`name`, ' ', 1) as name, cs.`expiryTimestamp`,
       (cs.`expiryTimestamp`  is not null) as isActiveFlag
FROM `general`.`exchange` e LEFT JOIN
     `courses`.`courseSubscriptions` cs
     ON cs.`memberID` = e.`id` AND (cs.expiryTimestamp > 1443975741) ;

答案 1 :(得分:0)

您已在join子句中重复where条件。由于null在等式检查中永远不会返回true,因此这会有效地删除没有任何课程的用户,并将外部联接转换为内部联接。同样,课程时间的条件也应该移到连接子句中:

SELECT     `general`.`exchange`.`email`, 
           SUBSTRING_INDEX(`general`.`exchange`.`name`, " ", 1) AS name, 
           `courses`.`courseSubscriptions`.`expiryTimestamp`  
FROM       `general`.`exchange` 
LEFT JOIN  `courses`.`courseSubscriptions` ON 
           `courses`.`courseSubscriptions`.`memberID` =
           `general`.`exchange`.`id` AND
           `courses`.`courseSubscriptions`.expiryTimestamp > 1443975741