我使用以下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)
问题是它只返回有订阅的用户。我需要它来返回所有用户,并在列中显示是否有订阅
我该怎么做?
答案 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