【问题标题】:How to do one big select from table in MySQL?如何从 MySQL 中的表中进行一大选择?
【发布时间】:2015-07-22 19:54:19
【问题描述】:

我需要将数据库中的数据显示到报表文件的表格中。

my_table 看起来像:

+----+-------+------+------+-------------------+-----------+-------+----+-------------------+
| id |entryID|userID|active|    dateCreated    |affiliateId|premium|free|     endDate       |
|  1 | 69856 |   1  |   N  |2014-03-22 13:54:49|     1     |   N   | N  |2014-03-22 13:54:49|   
|  2 | 63254 |   2  |   Y  |2014-03-21 13:35:15|     2     |   Y   | N  |                   |
|  3 | 56324 |   3  |   N  |2014-03-21 11:11:22|     2     |   Y   | N  |2014-02-22 16:44:46|
|  4 | 41256 |   4  |   Y  |2014-03-21 08:10:46|     1     |   N   | Y  |                   |
| .. |  ...  |  ... |  ... |        ...        |    ...    |  ...  | .. |   ...             | 
+----+-------+------+------+-------------------+-----------+-------+----+-------------------+

我需要使用来自my_table 的数据创建表

| Date | № of Entries (in that date) | Total № of Entries | Premium | Free | Afiiliate | 

文件中的最终表格应如下所示:

报告 17-07-2013:

+----------+--------------+-------+---------+------+-----------+
|   Date   | № of Entries | Total | Premium | Free | Afilliate |
|2013-07-17|      2       | 99845 |    2    |   0  |     0     |
|2013-07-18|      1       | 99843 |    0    |   1  |     0     |
|2013-07-22|      1       | 99842 |    1    |   0  |     1     |
|2013-07-23|      3       | 99841 |    2    |   1  |     2     |
|2013-07-24|     298      | 99838 |   32    |  273 |    25     |
|2013-07-25|    5526      | 99540 |  474    | 5058 |   126     |   
|2013-07-26|    1686      | 94014 |  157    | 1532 |    56     | 
|2013-07-27|    1673      | 92328 |  156    | 1517 |    97     |
|2013-07-28|    1461      | 90655 |  155    | 1310 |    83     |
|   ...    |     ...      |  ...  |   ...   |  ... |    ...    |
+----------+--------------+-------+---------+------+-----------+

我应该为每一列做一个SELECT 还是我应该只做一个选择? 如果可以做1选择怎么做?

应该类比这个报告: report

某些字段不同(例如“该日期的条目数”)。

条目总数是指:从开始到特定日期的所有条目。 该日期的条目数是指:该日期的所有条目。 在最终表格中,日期列中的日期不会重复,这就是为什么“条目数(在该日期)”列将计算该日期的所有条目。

【问题讨论】:

  • 您的意思是创建一个包含日期与“17-07-2013”​​之类的数据匹配的文件,还是要创建一个新表并将所选数据插入其中?
  • 这个新表可以在文件中,也可以在网页中。但它不是 DB 中的新表。
  • 假设“1 select”您的意思是select *,它只能按照从左到右的字面数据库顺序向您显示列。对于任何其他顺序,您必须特意按您想要的顺序指定每一列。
  • 我看不到其他字段,例如免费、高级等,它们在哪里?
  • 我将使用我已经拥有的编写器创建的表。结果表将显示在网页上,并将发送到电子邮件。我想它将是csv格式。我在想我将创建一个带有变量的对象,例如来自 db 的表的列,然后将这些数据写入表中。但我不确定这是否是最好的方法。

标签: mysql sql database


【解决方案1】:

您的结果不太清楚,因为总数是计数或总和,附属公司也是总和或计数

但假设总数将被计算并且附属将被总和

这里有一个查询,您可能会使用它来给您一个结果(使用 ms-sql)

select DateCreated,count(EntryId) as Total,
       sum(case when Premium='Y' then 1 else 0 end) as Premium,
       sum(case when Premium='N' then 1 else 0 end) as Free,
       sum(AffiliateId) as Affiliate
from sample
group by DateCreated

这里有一个工作的demo

如果我没有正确理解你,请指教

希望对你有帮助

【讨论】:

  • 对不起,我在显示表格时出错了。还有一个列 id。
  • 谢谢您的回答先生!
【解决方案2】:

SQLFiddle 演示:http://sqlfiddle.com/#!9/20cc0/5

添加的列entryID 对我们来说无关紧要。

我不太明白你对Total 的要求,或者affiliateID 的标准。此查询应该可以帮助您入门。

SELECT 
  DATE(dateCreated) as "Date", 
  count(dateCreated) as "No of Entries",
  99845 as Total,
  sum( case when premium='Y' then 1 else 0 end ) as Premium,
  sum( case when premium='N' then 1 else 0 end ) as Free,
  sum( case when affiliateID IS NOT NULL then 1 else 0 end) as Affiliate

 FROM MyTable
 GROUP BY DATE(dateCreated)
 ORDER BY Date ASC

文件中的最终表格应如下所示: ...这个新表可以在文件中或网页中。但这不是数据库中的新表。 ——

听起来您可能是这个领域的新手,所以我只想告诉您,将报告吐出到 网站文件 是非常不寻常的,通常只有当您的数据与网站完全分离时才会这样做。将数据库中的数据放到网站上(就像我们在这里所做的查询一样)非常常见,而且您很可能不需要弄乱任何文件。

【讨论】:

  • 谢谢您的回答先生!
【解决方案3】:
   select date(DateCreated),count(entryId) as Total,
       sum(case when Premium='Y' then 1 else 0 end) as Premium,
       sum(case when Premium='N' then 1 else 0 end) as Free,
       sum( case when affiliateID IS NOT NULL then 1 else 0 end) as Affiliate
INTO OUTFILE '/tmp/myfile.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
from my_table
group by date(DateCreated) order by date(DateCreated);

【讨论】:

  • 谢谢您的回答先生!
猜你喜欢
  • 1970-01-01
  • 2017-02-11
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多