mysql:查找具有重复值和条件的行[重复]

Posted

技术标签:

【中文标题】mysql:查找具有重复值和条件的行[重复]【英文标题】:mysql: find rows with repeated values plus condition [duplicate] 【发布时间】:2015-12-18 20:18:24 【问题描述】:

我有一个表“玩家”如下 在哪里: ID 是主键。

date = 他们玩的日期(仅 1 个月,因此可以从 1 到 30) 姓名 = 球员姓名 Sport = 他们从事的运动,列表中可能有很多运动;但我只关注“足球”一个

这是桌子

+----+------------+-------+-------------+
| ID | Date       | Name  | Sport       |
+----+------------+-------+-------------+
|  1 |          1 | A     | football    |
|  2 |          1 | A     | soccer      |
|  3 |          3 | A     | tennis      |
|  4 |          2 | B     | tennis      |
|  5 |          2 | B     | football    |
|  6 |          1 | C     | basketball  |
|  7 |          1 | C     | tennis      |
|  8 |          1 | C     | fishing     |
+----+------------+-------+-------------+

我想找出一天内参加 2 项以上运动的所有人(姓名和运动),其中一项运动必须是“足球”。

所以结果应该是这样的,

+----+------+------+----------+
| ID | Date | Name |  Sport   |
+----+------+------+----------+
|  1 |    1 | A    | football |
|  2 |    1 | A    | soccer   |
|  4 |    2 | B    | tenis    |
|  5 |    2 | B    | football |
+----+------+------+----------+

我们不计算名字“C”,因为他不踢足球(即使他一天参加超过 2 项运动)。

我试试

SELECT * FROM player GROUP BY Date, Name HAVING count(Date) > 1;

但不会给我想要的。

PS:此帖不是重复帖。这些答案在Finding duplicate values in mysql 不会直接针对这个问题。这是查找具有重复值和条件的行。请删除“重复”标签,以便其他人可以从这个问题中受益。

【问题讨论】:

在发布问题之前搜索社区 - ***.com/questions/688549/… 我在发布之前阅读并搜索过。那些“分组依据”和“计数> 1)只将那些重复行组合在一起。但我想要的是显示那些重复行+运动必须是“足球”的要求 请帮忙,我似乎在任何地方都找不到类似的请求。谢谢! @r00k,这不是类似的帖子! Re 30:有些月份有 31 天。超过 2 项:您的示例数据和查询表明您关心 2 项或更多运动。 Re不会给我我想要的东西:你为什么不从踢足球的球员中分组等等?一天内参加 2 项以上运动的人(姓名和运动):您的意思是,在一个月的同一天参加 2 项以上运动的人的姓名和运动。 【参考方案1】:

试试:

select
    a.*
from tbl a
join (
    select 
        date, name,
        max(case when Sport = 'football' then 1 else 0 end) val
    from tbl   
    group by date, name
    having count(date) > 1
) b on a.date = b.date and a.name = b.name
where b.val = 1

演示 sqlfiddle

【讨论】:

伟大的工作普拉文。谢谢。你的代码又好又干净!【参考方案2】:

您应该正在寻找这个:

pl1 有匹配的player namedate 谁玩过footballpl2 包括计数,pl3 让您找到所有玩过football 的玩家以及更多游戏date 然后你从pl4获取匹配的数据

SELECT 
    pl4.*
FROM
    player pl4
        JOIN
    (SELECT 
        pl2.name, pl2.date, COUNT(pl2.name) numberofgames
    FROM
        player pl2
    JOIN (SELECT 
        date, name
    FROM
        player
    WHERE
        sport = 'football') pl1 ON (pl2.name = pl1.name
        AND pl2.date = pl1.date)
    GROUP BY pl2.name , pl2.date
    HAVING numberofgames > 1) pl3 ON (pl3.name = pl4.name
        AND pl3.date = pl4.date)

【讨论】:

好答案兄弟。这不是我问的,但我很感激你的回答 非常感谢。这给了我我想要的。我有另一个后续问题,在哪里可以找到排除这些球员的列表(当天踢足球+其他比赛)***.com/questions/32721210 @TrungNguyen,看起来像你的作业。很高兴它奏效了!请接受答案。 @TrungNguyen,感谢您接受答案!

以上是关于mysql:查找具有重复值和条件的行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

面试官:MySQL 如何查找删除重复行?我竟然写不出来。。

使用 Activerecord、Rails 和 Postgres 查找具有多个重复字段的行

在列中查找具有重复值的行

在给定最大值的情况下查找表的行名[重复]

在 MySQL 中查找具有重复记录的 id

mysql查询以查找具有班级组合的学生[重复]