【问题标题】:mysql: find rows with repeated values plus condition [duplicate]mysql:查找具有重复值和条件的行[重复]
【发布时间】: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 不会直接针对这个问题。这是查找具有重复值和条件的行。请删除“重复”标签,以便其他人可以从这个问题中受益。

【问题讨论】:

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

标签: mysql


【解决方案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)

【讨论】:

  • 好答案兄弟。这不是我问的,但我很感激你的回答
  • 非常感谢。这给了我我想要的。我有另一个后续问题,在哪里可以找到排除这些球员的列表(当天踢足球+其他比赛)stackoverflow.com/questions/32721210
  • @TrungNguyen,看起来像你的作业。很高兴它奏效了!请接受答案。
  • @TrungNguyen,感谢您接受答案!
猜你喜欢
  • 2011-06-23
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 2012-09-26
  • 1970-01-01
相关资源
最近更新 更多