Php MySQL计算列值实例并按列值排序

Php MySQL计算列值实例并按列值排序,php,mysql,sql,Php,Mysql,Sql,我需要在一个表上执行一个相当高级的查询,该表保存客户发送的故障单,收集有关故障单的统计信息,并按各种计数和/或列值排序 票务表: +---------------------------+ | product_id | issue | +------------|--------------+ | 1 | missing-part | | 1 | missing-part | | 1 | broken-part

我需要在一个表上执行一个相当高级的查询,该表保存客户发送的故障单,收集有关故障单的统计信息,并按各种计数和/或列值排序

票务表:

+---------------------------+       
| product_id | issue        |
+------------|--------------+
| 1          | missing-part |
| 1          | missing-part |
| 1          | broken-part  |
| 2          | broken-part  |
| 2          | broken-part  |
| 2          | missing-part |
| 2          | missing-part |
| 2          | missing-part |
+---------------------------+
首先,我需要计算每个产品的总票数。在这种情况下,
product_id 1
有3张票据,
product_id 2
有5张票据。然后,我需要获得
issue
列的值以及每个列的出现次数。所以在这一点上,我期待着这样的事情:

[
  'product_id' => 1,
  'issues'     => 3
  'issue_nums' => [
    'missing-part' => 2,
    'broken-part'  => 1
  ]
],
[
  'product_id' => 2,
  'issues'     => 5,
  'issue_nums' => [
    'missing-part' => 3,
    'broken-part'  => 2
  ]
]
然后,我需要能够根据每个问题的出现次数进行排序,例如:
按计数排序(缺少部分)
计数(损坏部分)
。在其他情况下,我只需要能够按总发行量订购产品,而不是按发行量本身订购(因此按
COUNT(issues)
订购)


谢谢

yu可以使用子选择进行计数产品id出现,使用主选择进行发布

  select t1.product_id, t2.product_count, t1.issue, count(*) count_issue
  from  Tickets t1
  inner join  (
  select product_id, count(*)  product_count
  from Tickets 
  group by product_id) t2 on t2.product_id = t1.product_id
  group by t1.product_id, t2.product_count, t1.issue
  order by  count_issue

yu可以为计数产品id发生使用子选择,为发行使用主选择

  select t1.product_id, t2.product_count, t1.issue, count(*) count_issue
  from  Tickets t1
  inner join  (
  select product_id, count(*)  product_count
  from Tickets 
  group by product_id) t2 on t2.product_id = t1.product_id
  group by t1.product_id, t2.product_count, t1.issue
  order by  count_issue

您可以通过两个级别的聚合非常接近:

select t.product_id, sum(cnt) as total,
       group_concat(issue, ':', cnt separator ',') as issues
from (select t.product_id, t.issue, count(*) as cnt
      from tickets t
      group by t.product_id, t.issue
     ) tp
group by t.product_id;

您可以通过两个级别的聚合非常接近:

select t.product_id, sum(cnt) as total,
       group_concat(issue, ':', cnt separator ',') as issues
from (select t.product_id, t.issue, count(*) as cnt
      from tickets t
      group by t.product_id, t.issue
     ) tp
group by t.product_id;

您应该尝试自己编写代码。如果您有问题,请发布您尝试过的内容,并清楚解释哪些内容不起作用,然后提供。读一个好问题。请务必阅读和阅读。您正在寻找交叉表查询@JayBlanchard在问题中添加了一个SQL Fiddle来演示查询到目前为止的位置,并对问题进行了编辑以澄清查询需要添加哪些内容。您应该尝试自己编写代码。如果您有问题,请发布您尝试过的内容,并清楚解释哪些内容不起作用,然后提供。读一个好问题。请务必阅读和阅读。您正在寻找交叉表查询@JayBlanchard在问题中添加了一个SQL Fiddle来演示查询到目前为止的位置,并对问题进行了编辑以澄清查询需要添加哪些内容。感谢您的回答。我在问题中添加了一个SQLFiddle示例,演示了它目前所处的位置。基本上,那里的数据格式与需要的格式完全相同,除了
问题
列,该列应列出为产品提交的问题以及问题发生的次数。然后,我还需要能够按照问题出现的次数进行排序,例如,最高->最低数量的
缺少的零件。这有意义吗?t1.issue和count_issue应返回,然后Issus提交和相关发生时间。。和order by CONU发布应按出现次数返回列表顺序。。谢谢你的回答。我在问题中添加了一个SQLFiddle示例,演示了它目前所处的位置。基本上,那里的数据格式与需要的格式完全相同,除了
问题
列,该列应列出为产品提交的问题以及问题发生的次数。然后,我还需要能够按照问题出现的次数进行排序,例如,最高->最低数量的
缺少的零件。这有意义吗?t1.issue和count_issue应返回,然后Issus提交和相关发生时间。。和order by CONU发布应按出现次数返回列表顺序。。下面是您的示例的一个SQL文档:。它几乎拥有所有功能,除了能够按问题发生顺序排列结果。例如:哪些产品的
缺失零件最多
损坏零件最多
?我接受了您的回答,并将问题的后半部分移至新问题以避免混淆。下面是您的示例的一个SQL文档:。它几乎拥有所有功能,除了能够按问题发生顺序排列结果。例如:哪些产品的
缺失零件最多
损坏零件最多
?我接受了您的回答,并将问题的后半部分移至新问题以避免混淆。