Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 按多个内部联接分组_Mysql - Fatal编程技术网

Mysql 按多个内部联接分组

Mysql 按多个内部联接分组,mysql,Mysql,我有一个数据集,可以表示为棒球卡交易应用程序。有两个表跟踪个人拥有的卡和个人想要的卡。如果一个人拥有一张以上特定玩家卡的副本,则“拥有的卡”表中将有多行,此处不包括球队。如果有个人想要添加到其收藏中的卡片,则会在“想要的卡片”表中插入一行 拥有的信用卡: 通缉证: 我试图写一份声明,将自动匹配个人寻求交易。如果一个人拥有一张以上的信用卡,则假定他们会交易一张额外的信用卡。同样,如果他们只持有一张玩家卡的副本,他们不会提供该卡进行交易。假设所有卡的价值相等 SELECT fred_wants.pl

我有一个数据集,可以表示为棒球卡交易应用程序。有两个表跟踪个人拥有的卡和个人想要的卡。如果一个人拥有一张以上特定玩家卡的副本,则“拥有的卡”表中将有多行,此处不包括球队。如果有个人想要添加到其收藏中的卡片,则会在“想要的卡片”表中插入一行

拥有的信用卡:

通缉证:

我试图写一份声明,将自动匹配个人寻求交易。如果一个人拥有一张以上的信用卡,则假定他们会交易一张额外的信用卡。同样,如果他们只持有一张玩家卡的副本,他们不会提供该卡进行交易。假设所有卡的价值相等

SELECT fred_wants.player AS 'Fred Wants', mary_has.player AS 'Mary Has'
FROM wanted_cards fred_wants
INNER JOIN owned_cards mary_has ON fred_wants.owner = mary_has.owner
INNER JOIN wanted_cards mary_wants ON mary_has.owner = mary_wants.owner
INNER JOIN owned_cards fred_has ON fred_has.owner = mary_wants.owner
WHERE fred_wants.owner = 'Fred'
GROUP BY mary_has.player
HAVING COUNT(mary_has.player) > 1
产生:

| Fred Wants | Mary Has   |
|------------|------------|
| Lou Gehrig | Babe Ruth  |
| Babe Ruth  | Lou Gehrig |
| Babe Ruth  | Yogi Berra |
期望输出:

| Fred Wants | Mary Has   |
|------------|------------|
| Babe Ruth  | Yogi Berra |

弗雷德想要一张卢·格里格的卡片,但玛丽只有一张,所以不能交易。通过去掉组,我明白了为什么返回行,但我不明白为什么会生成这么多行;我原以为HAVE会缩减它。

下面是一个示例查询,它返回谁有Fred想要的卡片的额外内容:

select w.player as 'Fred Wants', t.owner as 'Who has extras'
from
wanted_cards as w
inner join
(
  select owner, player
  from owned_cards as o
  where o.owner <> 'Fred'
  group by owner, player
  having count(*) > 1
) as t
on (w.player = t.player)
where w.owner = 'Fred'

主要的想法是选择弗雷德想要的所有牌,然后为所有其他玩家找到所有额外的牌

为什么弗雷德想要贝比·鲁斯!?!?此外,在进行更多操作之前,您还需要一个主键。@您已经太深入人心了,建议您重新阅读问题的第一句话。谢谢,我认为子查询实际上也更具可读性
| Fred Wants | Mary Has   |
|------------|------------|
| Babe Ruth  | Yogi Berra |
select w.player as 'Fred Wants', t.owner as 'Who has extras'
from
wanted_cards as w
inner join
(
  select owner, player
  from owned_cards as o
  where o.owner <> 'Fred'
  group by owner, player
  having count(*) > 1
) as t
on (w.player = t.player)
where w.owner = 'Fred'