如何比较sql中同一个表的行

时间:2014-02-02 02:04:01

标签: mysql sql

我的表是:

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    

这是我经常光顾的表格,我只需要选择乔和史密斯以及杰克和杰夫,因为他们访问完全相同的酒吧。

4 个答案:

答案 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