我有一个简单的应用程序,可以跟踪食客和他们喜欢的口味和甜点。 records
表只是用餐者的名字和ID,mid
表跟踪甜点和口味(再次通过链接到另一个值表的ID)。
CREATE TABLE IF NOT EXISTS `records` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
INSERT INTO `records` (`id`, `name`) VALUES
(1, 'Jimmy Jones'),
(2, 'William Henry');
CREATE TABLE IF NOT EXISTS `mid` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`diner` int(11) NOT NULL,
`dessert` int(11) NOT NULL DEFAULT '0',
`flavor` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
INSERT INTO `mid` (`id`, `diner`, `dessert`, `flavor`) VALUES
(1, 1, 3, 0),
(2, 1, 2, 0),
(3, 1, 15, 0),
(4, 1, 0, 1),
(5, 2, 3, 0),
(6, 2, 6, 0),
(7, 2, 0, 4),
(8, 1, 34, 0),
(9, 2, 0, 4),
(10, 2, 0, 22);
我对应该是一个简单的查询感到有些困惑 - 我希望从records
表中获取满足某些甜点或风味要求的所有ID:
SELECT a.id
FROM records AS a
JOIN mid AS b ON a.id = b.diner
WHERE b.dessert IN (3,2,6)
AND b.flavor IN (4,22)
即使存在与where子句匹配的记录,此查询也不返回任何行。我很确定我错过了JOIN
的明显内容,但我尝试了INNER,OUTER,LEFT和RIGHT但没有成功。
有人能让我走上正轨并解释我所缺少的东西吗?
由于
答案 0 :(得分:0)
您的SQL语句没问题,但您的样本记录中没有符合您的条件,匹配的记录应该如下所示
dessert flavor
3 4
3 22
2 4
2 33
6 4
6 22
您的输入记录中没有任何这些组合
答案 1 :(得分:0)
您似乎希望食客拥有这些组合。这是一种方式:
select diner
from records
group by diner
having max(b.dessert = 3) = 1 and
max(b.dessert = 2) = 1 and
max(b.dessert = 6) = 1 and
max(b.flavor = 4) = 1 and
max(b.flavor = 22) = 1
这回答了你的评论:
select diner
from records
group by diner
having max(case when b.dessert in (2, 3, 6) then 1 esle 0 end) = 1 and
max(case when b.dessert in (4, 22) then 1 else 0 end) = 1
如果您只是在寻找符合条件的记录,请使用:
select r.*, d.name
from records r join
diner d
on r.diner = d.id
where b.dessert IN (3,2,6) AND b.flavor IN (4,22)
如果这是你想要的,你的查询中的连接条件是错误的(a.id应该是a.diner)。
答案 2 :(得分:0)
你的WHERE条件不适合“mid”表中的任何记录。
没有记录在(3,2,6)和(4,22)的味道中有甜点,因此查询(正确)不会返回任何结果。
答案 3 :(得分:0)
您没有任何符合条件的记录。
( 1, 1, 3, 0) - Matches dessert IN (3,2,6)
( 2, 1, 2, 0) - Matches dessert IN (3,2,6)
( 3, 1, 15, 0)
( 4, 1, 0, 1)
( 5, 2, 3, 0) - Matches dessert IN (3,2,6)
( 6, 2, 6, 0) - Matches dessert IN (3,2,6)
( 7, 2, 0, 4) - Matches flavor IN (4,22)
( 8, 1, 34, 0)
( 9, 2, 0, 4) - Matches flavor IN (4,22)
(10, 2, 0, 22) - Matches flavor IN (4,22)
也许你的意思是OR?
SELECT a.id
FROM records AS a
JOIN mid AS b ON a.id = b.diner
WHERE b.dessert IN (3,2,6)
OR b.flavor IN (4,22)
应该返回7个结果。
另外,你对JOIN的想法是一个红色的鲱鱼。 LEFT和RIGHT之间的区别在于当join子句与它们之间的记录不匹配时哪个表优先。 INNER和OUTER之间的区别就是当两个表之间没有匹配的记录时会发生的情况。试试这个explanative article from coding horror以获取有关连接的更多详细信息(在不同的SO问题中帮助我指出,呵呵)。