【问题标题】:Find the most common value in a table [SQL,MySQL] [duplicate]查找表中最常见的值[SQL,MySQL] [重复]
【发布时间】:2019-08-05 22:58:39
【问题描述】:

我找不到太多信息可以帮助我找到表格中最常见的值,所以我在这里。如您所见,表格(ticketFlightNumber)如下所示,我必须从该表格中返回最受欢迎的航班。

例如在这张图片中,将返回航班 UA245,因为它是数据库中使用最多的航班。

谁能帮我确定一个足够强大的查询来返回最受欢迎的航班/航班列表?

谢谢!

请注意:第 1-19 列是不同的转机,它们的值是 varchar

【问题讨论】:

  • 这可能会解决我的问题,除非我必须检查所有列 1-19 并且它是一个字符串而不是整数......但是会尝试该方法并更新
  • 首先修复您的架构设计。数据库表不是电子表格
  • @Strawberry 表被设计成这样的原因是因为我无法想象数据库可以在哪里以某种方式传达有关多个航班或旅程“行程”的信息。我决定使用这种设计,因为实际上没有人会拥有超过 19 个连接航班。我欢迎另一种架构设计,但我想不出一个

标签: mysql sql


【解决方案1】:

这是另一种架构设计:

ticket_no*,leg*,flight_code

* = (component of) PRIMARY KEY

相比之下,其他答案似乎很荒谬。

ticket_no leg flight_code
        0   1 UA123
        0   2 UA245
        1   1 UA123
        1   2 UA245
        1   3 UA245
        1   4 UA123
        2   1 UA666

【讨论】:

  • 唉,我之前没有想到这一点,但这绝对是有道理的,但是当您开始搜索一张票的所有腿时,您在运行时会遇到类似的复杂性。对我来说问题是我必须找到最活跃的航班......换句话说,所有机票使用最多的航班。在这种情况下,与下面的解决方案相比,您的表格会具有相似的复杂性,不是吗?
  • 没有。这是正确的做法。如果您提供所需的结果,我们将向您展示如何使用上述架构实现它。
  • 是的,你是对的。在这种情况下,为了找到最常用的航班号,我可以执行以下操作:select count(*) where flight_code = "UA123" 并对所有其他航班号执行此操作...这绝对是一个可行的解决方案,我将更改我的架构因为这是一个更好的方法。谢谢:)
  • 不完全。要查找最常用的航班代码(在这种情况下为平局),您可以使用此代码(其他解决方案可用):SELECT x.flight_code FROM ( SELECT flight_code , COUNT(*) total FROM my_table GROUP BY flight_code ) x JOIN ( SELECT COUNT(*) total FROM my_table GROUP BY flight_code ORDER BY total DESC LIMIT 1 ) y ON y.total = x.total;
  • 噢噢噢。抱歉,我是 SQL 新手,哈哈。这很好。
【解决方案2】:

@Gordon 工作的查询略有变化,

select flight, count(*) as c
from ((select `1` as flight from ticketFlightNumbers) union all
(select `2` from ticketFlightNumbers) union all
(select `3` from ticketFlightNumbers) union all
(select `4` from ticketFlightNumbers) union all
(select `5` from ticketFlightNumbers) union all
(select `6` from ticketFlightNumbers) union all
(select `7` from ticketFlightNumbers) union all
(select `8` from ticketFlightNumbers) union all
(select `9` from ticketFlightNumbers) union all
(select `10`  from ticketFlightNumbers) union all
(select `11`  from ticketFlightNumbers) union all
(select `12`  from ticketFlightNumbers) union all
(select `13`  from ticketFlightNumbers) union all
(select `14`  from ticketFlightNumbers) union all
(select `15`  from ticketFlightNumbers) union all
(select `16`  from ticketFlightNumbers) union all
(select `17`  from ticketFlightNumbers) union all
(select `18`  from ticketFlightNumbers) union all
(select `19`  from ticketFlightNumbers)) t
group by flight
order by c desc;

【讨论】:

    【解决方案3】:

    您需要取消透视数据和聚合。在 MySQL 中最简单的方法是union all:

    select flight, count(*)
    from ((select `1` as flight from t) union all
          (select `2` from t) union all
          . . .
         ) t
    group by flight
    order by count(*) desc;
    

    您可以添加limit 以获得最常见的值。

    【讨论】:

    • select "1" as ... 不应该是列名吗?如果是这样,那么它不是用反勾号(`)括起来吗?
    • 嗨,Gordon,感谢您抽出宝贵时间尝试解决我的问题。我在实施您的潜在解决方案时遇到问题。我希望澄清它。表名称是ticketFlightNumbers,这是我试图至少测试初始表的内容......这就是我得到的:输入:select "1" as flight from ticketFlightNumbers union all select "2" as flight from ticketFlightNumbers 输出:1 1 1 2 2 2
    • @James 。 . .是的,它们应该是反引号。双引号是标准,但 MySQL 不支持。
    • @GordonLinoff 是的,它认为是一个值而不是一个列。
    【解决方案4】:

    首先感谢@James 和@Gordon 的帮助。可以说,如果有人感兴趣,James 的解决方案会更好。

    SELECT SUM(CASE WHEN t.1= "UA123" THEN 1 ELSE 0 END) + 
    SUM(CASE WHEN t.2= "UA123" THEN 1 ELSE 0 END) + 
    SUM(CASE WHEN t.3= "UA123" THEN 1 ELSE 0 END) + 
    SUM(CASE WHEN t.4= "UA123" THEN 1 ELSE 0 END) + 
    SUM(CASE WHEN t.5= "UA123" THEN 1 ELSE 0 END) + 
    SUM(CASE WHEN t.6= "UA123" THEN 1 ELSE 0 END) + 
    SUM(CASE WHEN t.7= "UA123" THEN 1 ELSE 0 END)+ 
    SUM(CASE WHEN t.8= "UA123" THEN 1 ELSE 0 END)+ 
    SUM(CASE WHEN t.9= "UA123" THEN 1 ELSE 0 END) +
     SUM(CASE WHEN t.10= "UA123" THEN 1 ELSE 0 END) + 
     SUM(CASE WHEN t.11= "UA123" THEN 1 ELSE 0 END) + 
     SUM(CASE WHEN t.12= "UA123" THEN 1 ELSE 0 END) + 
     SUM(CASE WHEN t.13= "UA123" THEN 1 ELSE 0 END) + 
     SUM(CASE WHEN t.14= "UA123" THEN 1 ELSE 0 END) + 
     SUM(CASE WHEN t.15= "UA123" THEN 1 ELSE 0 END)+ 
     SUM(CASE WHEN t.16= "UA123" THEN 1 ELSE 0 END)+ 
     SUM(CASE WHEN t.17= "UA123" THEN 1 ELSE 0 END) + 
     SUM(CASE WHEN t.18= "UA123" THEN 1 ELSE 0 END)+ 
     SUM(CASE WHEN t.19= "UA123" THEN 1 ELSE 0 END)
    FROM ticketFlightNumbers t
    

    由于这个项目是在 JSP 中完成的,引号中的航班号被 java 通过一个 while 循环动态替换,该循环遍历所有已知的航班号并每次运行此查询。

    同样@James 和@Gordon,他们的解决方案更好,因为所有工作都通过一个查询完成。

    【讨论】:

      猜你喜欢
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 2014-08-04
      • 2018-06-13
      • 1970-01-01
      • 2014-08-08
      相关资源
      最近更新 更多