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。其他一切都很好。非常感谢。我在文章中的最后一行是所需的输出。