MySQL左连接没有给我我期望的东西

Posted

技术标签:

【中文标题】MySQL左连接没有给我我期望的东西【英文标题】:MySQL left join doesnt give me what i expect 【发布时间】:2014-05-29 15:26:49 【问题描述】:

我需要一些关于左连接语句的帮助,该语句没有做我认为应该做的事情,可能是错误的。

有两个表:

光盘:

CREATE TABLE `cd` (
  `itemID` int(11) NOT NULL AUTO_INCREMENT,
  `title` text NOT NULL,
  `artist` text NOT NULL,
  `genre` text NOT NULL,
  `tracks` int(11) NOT NULL,
  PRIMARY KEY (`itemID`)
)

贷款

CREATE TABLE `loans` (
  `itemID` int(11) NOT NULL,
  `itemType` varchar(20) NOT NULL,
  `userID` int(11) NOT NULL,
  `dueDate` date NOT NULL,
  PRIMARY KEY (`itemID`,`itemType`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我想使用左连接选择所有不在贷款中的 cd,然后选择其中的到期日期为空

select 
    t.itemID, 
    t.artist as first, 
    t. title as second, 
    (select AVG(rating) from ac9039.ratings where itemType = 'cd' and itemId = t.itemID) as `rating avarage`, 
    (select COUNT(rating) from ac9039.ratings where itemType = 'cd' and itemId = t.itemID) as `number of ratings` 
from 
    cd t left join loans l 
    on t.itemID = l.itemID 
where l.itemType = 'cd' and l.dueDate is null;

然而,即使 cd 中有很多行的 itemID 不在贷款中,此表也会返回一个空表

现在我明白左连接应该保留右侧并用空值填充左侧的列 但是好像不是这样的,有大神能赐教吗?

【问题讨论】:

将 'where' 更改为 'and' 并将 'and' 更改为 'where' 【参考方案1】:

您的WHERE 条件会导致错误。如果L.DueDate IS NULL 为真,L.ItemType = 'cd' 将始终返回假。 (你所有的字段都是NOT NULL,所以DueDate在没有匹配记录的情况下只能是NULL,但在这种情况下ItemType字段也将是NULL

另一点是您的查询在语义上不正确。您正在尝试从cd 表中获取记录,其中loans 表不包含任何带有dueDates 的行。 第二个表作为条件,所以应该去WHERE条件。

考虑使用EXISTS 语句来实现您的目标:

SELECT 
    t.itemID, 
    t.artist as first, 
    t. title as second, 
    (select AVG(rating) from ac9039.ratings where itemType = 'cd' and itemId = t.itemID) as `rating avarage`, 
    (select COUNT(rating) from ac9039.ratings where itemType = 'cd' and itemId = t.itemID) as `number of ratings` 
FROM 
    cd t
WHERE
    NOT EXISTS (SELECT 1 FROM loans l WHERE t.itemID = l.itemID AND L.itemType = 'cd')

根据您的数据模型,您必须向子查询添加另一个条件以过滤掉那些现在过期的记录(dueDate 早于当前时间)

当您不删除过期的贷款记录时就是这种情况。

NOT EXISTS (SELECT 1 FROM loans l WHERE t.itemID = l.itemID AND AND L.itemType = 'cd' l.dueDate > NOW())

【讨论】:

这有用吗?我不相信。 问题中的查询在语义上不正确,这就是我建议 EXISTS 方法的原因。好的,现在我明白你的意思了:) @Strawberry 我刚刚更新了我的答案,使其更加精确。

以上是关于MySQL左连接没有给我我期望的东西的主要内容,如果未能解决你的问题,请参考以下文章

mysql左连接没有数据还会查出来吗

MySQL 性能:使用左连接的一个查询与多个查询

mysql 左连接,右连接

左连接,右连接,内连接,外连接, join, left join, right join ,mysql ,oracle

MySQL选择左连接不同?

MySQL - 向左连接添加子句