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左连接没有给我我期望的东西的主要内容,如果未能解决你的问题,请参考以下文章