Mysql 如何在sql中比较同一表中的行
我的桌子是:Mysql 如何在sql中比较同一表中的行,mysql,sql,Mysql,Sql,我的桌子是: frequents(bar,drinker); likes(beer,drinker); serves(bar,beer) 我想选择经常光顾完全相同酒吧的成对饮酒者。我想我可以只使用frequents表编写该查询,因为它有酒吧和饮酒者列,使用我尝试过的自连接,但无法获得。我也不介意使用其他表来获得确切的查询。查询必须只选择光顾相同酒吧的饮酒者。在换句话说,它们应该有所有的公共条。查询必须是通用的形式,它不应该依赖于数据,这就是为什么我没有放任何数据 DRINKER | B
frequents(bar,drinker);
likes(beer,drinker);
serves(bar,beer)
我想选择经常光顾完全相同酒吧的成对饮酒者。我想我可以只使用frequents表编写该查询,因为它有酒吧和饮酒者列,使用我尝试过的自连接,但无法获得。我也不介意使用其他表来获得确切的查询。查询必须只选择光顾相同酒吧的饮酒者。在换句话说,它们应该有所有的公共条。查询必须是通用的形式,它不应该依赖于数据,这就是为什么我没有放任何数据
DRINKER | BAR
____________________
John | Hyatt
Smith | Blue
William | Hilton
John | Geoffreys
Smith | Hyatt
Joe | Blue
Mike | Hilton
William | Dublin
Jeff | Hilton
Jake | Hilton
这是我的频度表,我只需要选择Joe和Smith,还有Jake和Jeff,因为他们访问完全相同的酒吧。这可能会有所帮助,但我使用的是我从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.饮酒者包含饮酒者去的酒吧,F.饮酒者是饮酒者的名单。我对语法不是百分之百的了解,但这个想法是正确的
我已经4个月没有使用SQL了。如果您不使用它,您就会失去它: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;
编辑
您也可以使用连接来实现这一点,但要正确地实现这一点,您需要一个完整的外部连接—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);
fixnode的答案很好,虽然它缺少两个我认为重要的小细节,但只选择不重复的结果,并以有用的方式对它们进行排序
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');
您没有显示任何人想要的输出,但是如果您为条添加一个表,那么这将对您有效
select f.bar, f.drinker from frequents f
inner join bar b on b.bar = f.bar
我知道这不是你想要的方式,但如果你知道只会有5个酒吧,那么你可以有5个select语句,说select drinker from FRIMENTS,其中bar=bar1,并重复4次。你显示的信息是表格的确切结构吗?任何地方都没有id?@PatomaS没有id,也没有主键我知道这毫无意义,但这会使查询更加困难why@Howlin我不想在我的查询中使用数据,它应该是一般形式的。发布示例数据,期望的输出和不成功的尝试第一次join语句失败,因为饮酒者和酒吧永远不会相等。我需要选择访问完全相同酒吧的饮酒者,例如,如果饮酒者_1转到酒吧_1和酒吧_3,饮酒者_2转到酒吧_3,则输出应为空集,因为饮酒者_2没有转到酒吧_3。第一次查询返回一个空集,但我有只访问相同酒吧的饮酒者。@user1613360。固定的子查询中缺少group by。U应该用f替换fd。其他一切都很好。非常感谢。我在文章中的最后一行是所需的输出。