我的表是:
frequents(bar,drinker);
likes(beer,drinker);
serves(bar,beer)
我想“选择那些经常光顾相同酒吧的饮酒者”。我想我只能使用频率表(因为它有酒吧和饮酒者专栏)使用自我关节来编写该查询我试图做但不能得到它。我不介意使用其他表来获得确切的查询。查询必须选择只去相同酒吧的饮酒者。换句话说,他们应该有所有共同的酒吧。查询必须是在广义形式中,它不应该依赖于数据,这就是我没有提供任何数据的原因。
DRINKER | BAR
____________________
John | Hyatt
Smith | Blue
William | Hilton
John | Geoffreys
Smith | Hyatt
Joe | Blue
Mike | Hilton
William | Dublin
Jeff | Hilton
Jake | Hilton
这是我经常光顾的表格,我只需要选择乔和史密斯以及杰克和杰夫,因为他们访问完全相同的酒吧。
答案 0 :(得分:1)
在MySQL中最简单的方法是使用group_concat()
将值放在一起并进行比较:
select fd.bars, group_concat(fd.drinker) as drinkers
from (select f.drinker, group_concat(f.bar order by f.bar) as bars
from frequents f
group by f.drinker
) fd
group by bars
having count(*) > 1;
修改
您也可以使用join
执行此操作,但为了正确执行此操作,您需要full outer join
- MySQL不支持。
另一种方法是计算每个条形图的数量,进行内部连接,并确保计数与条形图匹配:
select f1.drinker, f2.drinker
from frequents f1 join
frequents f2
on f1.bar = f2.bar join
(select f.drinker, count(*) as numbars
from frequents f
group by f.drinker
) fd1
on f1.drinker = fd1.numbars join
(select f.drinker, count(*) as numbars
from frequents f
group by f.drinker
) fd2
on f2.drinker = f2.drinker
group by f1.drinker, f2.drinker
having count(*) = max(f1.numbars) and count(*) = max(f2.numbars);
答案 1 :(得分:0)
这可能会有所帮助,但我使用的是Microsoft SQL Server的知识。语法可能与MYSQL不同。话虽如此,你需要将表格加入其中。
SELECT F.Bars, F.Drinkers, FB.Drinker
FROM frequents F
JOIN frequents FB ON (FB.Drinkers = F.Bars)
WHERE FB.Drinkers = F.Drinkers
基本上我加入同一张桌子,说FB.Drinkers包含饮酒者去的酒吧,而F.Drinkers是饮酒者的名单。我不是100%的语法,但这个想法是正确的。
我在4个月内没有做过SQL。如果你不使用它,你就松开它:)
答案 2 :(得分:0)
fixnode的答案非常好,虽然它缺少我认为很重要的2个小细节,只选择非重复的结果并以有用的方式对它们进行排序。
SELECT DISTINCT tbl_1.drinker, tbl_1.bar
FROM `frequents` AS tbl_1
LEFT JOIN frequents AS tbl_2 ON tbl_1.bar = tbl_2.bar WHERE tbl_1.bar = tbl_2.bar
ORDER BY tbl_1.bar;
这是我用于测试的内容
CREATE TABLE IF NOT EXISTS `frequents` (
`bar` varchar(100) NOT NULL,
`drinker` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `frequents` (`bar`, `drinker`) VALUES
('bar_1', 'drinker_3'),
('bar_2', 'drinker_3'),
('bar_3', 'drinker_4'),
('bar_4', 'drinker_1'),
('bar_5', 'drinker_1'),
('bar_1', 'drinker_5'),
('bar_2', 'drinker_4'),
('bar_3', 'drinker_3'),
('bar_4', 'drinker_2'),
('bar_5', 'drinker_1');
答案 3 :(得分:0)
嗯,你没有显示任何想要的输出但是如果你为这个栏添加一个表,那么这对你有用
select f.bar, f.drinker from frequents f
inner join bar b on b.bar = f.bar