【问题标题】:Get each day of the week as columns MySQL and PHP获取一周中的每一天作为 MySQL 和 PHP 列
【发布时间】:2017-03-18 21:07:53
【问题描述】:

我正在用 PHP 和 MySQL 编写一个 Web 应用程序。

我有一个名为 counts 的表,这就是数据在该表中的存储方式:

表:计数 id 计数 location_id media_id created_at -------------------------------------------------- 1 50 1 1 2017-03-15 2 30 2 1 2017-03-15 3 80 1 2 2017-03-15 4 20 1 1 2017-03-16 5 100 2 2 2017-03-16

对于每个唯一的 location_id、media_id 和 created_at,我都会存储计数。

我有另一个桌子位置是这样的:

表:位置 身份证名称 ---------------- 1 地点 1 2 位置 2 3 位置 3 4 位置 4 5 位置 5

这是我目前的 SQL 查询:

选择 sum(counts.count) 作为视图,locations.name 作为位置,DAYNAME(counts.created_at) AS weekday from `counts` 内部加入 `locations` on `locations`.`id` = `counts`.`location_id` where `counts`.`created_at` 在 '2016-12-04' 和 '2016-12-10' 之间按 `weekday` 分组,`counts`.`location_id`;

这是数据的显示方式:

地点工作日视图 ---------------------------------- 地点 1 星期一 50 地点 1 周二 30 地点 2 星期一 20 地点 2 周二 70

我正在创建报告,并且我想运行一个查询,以便一周中的所有天都显示为一列,其对应的值作为一周中那一天的查看次数。我想要这样的东西:

地点 周一 周二 周三 周四 周五 周六 周日 ------------------------------------------------- 位置 1 40 60 51 20 40 20 30 位置 2 80 60 100 24 30 10 5

以上在 MySQL 中是否可行,或者我必须使用 PHP 来实现?如果是这样,我该怎么做?

任何帮助将不胜感激,谢谢。

注意:样本数据不准确。

【问题讨论】:

  • MySQL 查询可帮助您从数据库中检索数据,但它们无助于格式化数据输出。 PHP 通常用于为网络浏览器创建 HTML 输出,它可以明确地为您格式化输出。结论:您需要检索数据并格式化输出。试试看,如果你不能让它工作,请告诉我们你的代码。
  • 好吧,如果这不可能,那么我显然需要格式化输出。我认为使用 MySQL 是可能的。

标签: php mysql


【解决方案1】:

使用条件聚合可以通过 MySQL 实现此结果。

诀窍是在 SELECT 列表中的表达式中使用条件测试来确定是否返回 count 值。

类似这样的:

 SELECT l.name                                                  AS `locations`
      , SUM(IF(DATE_FORMAT(c.created_at,'%a')='Mon',c.count,0)) AS `mon`
      , SUM(IF(DATE_FORMAT(c.created_at,'%a')='Tue',c.count,0)) AS `tue`
      , SUM(IF(DATE_FORMAT(c.created_at,'%a')='Wed',c.count,0)) AS `wed`
      , SUM(IF(DATE_FORMAT(c.created_at,'%a')='Thu',c.count,0)) AS `thu`
      , SUM(IF(DATE_FORMAT(c.created_at,'%a')='Fri',c.count,0)) AS `fri`
      , SUM(IF(DATE_FORMAT(c.created_at,'%a')='Sat',c.count,0)) AS `sat`
      , SUM(IF(DATE_FORMAT(c.created_at,'%a')='Sun',c.count,0)) AS `sun`
   FROM `locations` l
   LEFT
   JOIN `counts` c
     ON c.location_id = l.id
    AND c.created_at >= '2016-12-04'
    AND c.created_at  < '2016-12-04' + INTERVAL 7 DAY 
  GROUP BY l.name
  ORDER BY l.name

注意:

对于示例数据,location_id=1 and created_at='2016-03-15' 有两行,因此此查询将返回总计 130 的 tue (=50+80),而不是 50(如现有查询的示例输出所示)。

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 2010-12-26
    • 1970-01-01
    • 2021-07-21
    • 2011-06-15
    • 2013-04-20
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多