2015-10-04 25 views
1

我正在使用下面的mysql来查看用户订阅。我需要得到所有用户,并在一所中显示,如果他们有一个活跃的认购或不mysql完全加入不能正常工作

这是我曾尝试:

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` 
WHERE (`courses`.`courseSubscriptions`.memberID = `general`.`exchange`.`id`) 
AND (`courses`.`courseSubscriptions`.expiryTimestamp > 1443975741) 

的问题是,它仅返回谁拥有用户订阅。我需要它返回所有用户,并显示在有订阅或不订阅的专栏

我该怎么做?

+0

可以添加示例数据的几行对每个表,你希望得到的结果 – Phil

+0

你的加入究竟是不是一个'完全加入'(MySQL不支持)。这是一个“左连接”。 –

+0

也不要使用双引号作为字符串参数,总是使用单引号RDBM可能会错过解释。 @GordonLinoff的答案显示它已修复! –

回答

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问题的解决方案是在表移动的条件进入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) ; 
+0

都有一排我在'on子句'中收到未知列'g.exchange.id' – Jake

+0

@Jake。 。 。这是一个错字。两个表别名是'e'和'cs',并且适用于所有列名称。 –

0

你重复where子句中的join条件。由于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 
+0

我试过这个,但它只返回存在于'courses'.courseSubscriptions'表中的行,并不是每个用户都在该表中有一行。 – Jake

+0

@Jake忘记了将expiryTimestamp条件也移到'join'子句中。 Mea culpa。编辑并修复。 – Mureinik