哦,我的标题不是最好的,因为英语不是我的主要语言,如果有人理解这里的问题,也许有人可以解决这个问题而不是投反对票。
基本上我有两个表 - 锦标赛玩家和结果。 Tourneyplayers 就像一个边 table ,它收集了多个表格中的锦标赛信息 - 结果、锦标赛、玩家等。我想检查结果表中 day1_best 列的重复项,来自单个锦标赛并返回所有具有重复项的锦标赛玩家。
Tourneyplayers 包含行:
Tourneyplayers
tp_id | resultid | tourneyid
1 | 2 | 91
2 | 21 | 91
3 | 29 | 91
4 | 1 | 91
5 | 3 | 92
结果包含行:
Results:
r_id | day1_best
1 | 3
2 | 1
3 | 4
.. | ..
21 | 1
.. | ..
29 | 2
现在 id = 91 的比赛共有 4 个结果,id 为 1、2、21 和 29。我想返回有重复的值,所以目前的结果是
Result
tp_id | resultid | day1_best
1 | 2 | 1
2 | 21 | 1
我试过这样写:
SELECT *
FROM tourneyplayers
WHERE resultid
IN (
SELECT r1.r_id
FROM results AS r1
INNER JOIN results AS r2 ON ( r1.day1_best = r2.day1_best )
AND (
r1.r_id <> r2.r_id
)
)
AND tourneyid =91
但是除了具有相同 day1_best 的值之外,它还选择了两个不相同的值。我如何改进我的 SQL 或重写它?
最佳答案
首先,您JOIN
两个表,这样您就知道数据的样子了。
SELECT *
FROM tourney_players t
JOIN results r
ON t.`resultid` = r.`r_id`;
然后使用相同的查询GROUP
来查看tourneyid, day1_best
组合有多行
SELECT `tourneyid`, `day1_best`, count(*) as total
FROM tourney_players t
JOIN results r
ON t.`resultid` = r.`r_id`
GROUP BY `tourneyid`, `day1_best`;
最后,您使用基础 JOIN
并执行 LEFT JOIN
以查看哪些行具有匹配项并仅显示这些行。
SELECT t.`tp_id`, r.`r_id`, r.`day1_best`
FROM tourney_players t
JOIN results r
ON t.`resultid` = r.`r_id`
LEFT JOIN (SELECT `tourneyid`, `day1_best`, count(*) as total
FROM tourney_players t
JOIN results r
ON t.`resultid` = r.`r_id`
GROUP BY `tourneyid`, `day1_best`
HAVING count(*) > 1) as filter
ON t.`tourneyid` = filter.`tourneyid`
AND r.`day1_best` = filter.`day1_best`
WHERE filter.`tourneyid` IS NOT NULL;
输出
关于mysql - 从同一个表中查找重复项并从 sql 中的另一个表中约束它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41722154/