mysql查询,查询的不是表里的数据,而是知道的数字。

aaabcad 2016-04-28 08:01:46
我想通过一条sql或方法函数查询。主要用于统计分析。
比如,一张表,比里面有id和date(时间),表是空表,没有任何数据。
问题:要根据时间查询,比如要查询2月每天的数据,及时表是空表,也要查询出2月1号到29号的记录,时间不是表里的时间,而是根据逻辑查询的时间,查出的数据,id是空,有时间的29行数据。


不知道我说问题清楚啦没有,如果有不明白的地方,问我。
还有个无聊的问题,就是怎么查询1到10,10行数据,10数据不是表里的数据,而是逻辑数据。跟上面的一样。
...全文
188 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
benluobo 2016-04-29
  • 打赏
  • 举报
回复
使用辅助表,使用left join可以满足
gikod 2016-04-28
  • 打赏
  • 举报
回复
有了上面的这个任意月的日期select作为基础,就可以写出outer join了 假设t是你想要select的表

MariaDB [demo]> create table t(id int primary key, d date);
Query OK, 0 rows affected (0.22 sec)

MariaDB [demo]> select * from t;
Empty set (0.00 sec)
那么select是

MariaDB [demo]> select t.*, m.*
    -> from t right outer join
    -> (select * from
    ->   (select @d := date_add(@d, interval 1 day) d
    ->   from
    ->     dummy,
    ->     (select
    ->       @b := str_to_date ('2016.4.1', '%Y.%m.%d'),
    ->       @d := date_add(@b, interval -1 day),
    ->       @e := date_add(@b, interval 1 month)
    ->     ) s
    ->   ) t_d
    -> where d < @e) m
    -> on (t.d = m.d)
    -> ;
+------+------+------------+
| id   | d    | d          |
+------+------+------------+
| NULL | NULL | 2016-04-01 |
| NULL | NULL | 2016-04-02 |
| NULL | NULL | 2016-04-03 |
| NULL | NULL | 2016-04-04 |
| NULL | NULL | 2016-04-05 |
| NULL | NULL | 2016-04-06 |
| NULL | NULL | 2016-04-07 |
| NULL | NULL | 2016-04-08 |
| NULL | NULL | 2016-04-09 |
| NULL | NULL | 2016-04-10 |
| NULL | NULL | 2016-04-11 |
| NULL | NULL | 2016-04-12 |
| NULL | NULL | 2016-04-13 |
| NULL | NULL | 2016-04-14 |
| NULL | NULL | 2016-04-15 |
| NULL | NULL | 2016-04-16 |
| NULL | NULL | 2016-04-17 |
| NULL | NULL | 2016-04-18 |
| NULL | NULL | 2016-04-19 |
| NULL | NULL | 2016-04-20 |
| NULL | NULL | 2016-04-21 |
| NULL | NULL | 2016-04-22 |
| NULL | NULL | 2016-04-23 |
| NULL | NULL | 2016-04-24 |
| NULL | NULL | 2016-04-25 |
| NULL | NULL | 2016-04-26 |
| NULL | NULL | 2016-04-27 |
| NULL | NULL | 2016-04-28 |
| NULL | NULL | 2016-04-29 |
| NULL | NULL | 2016-04-30 |
+------+------+------------+
30 rows in set (0.00 sec)
gikod 2016-04-28
  • 打赏
  • 举报
回复
有办法,主要是通过变量计算得到。 一共有准备工作和具体select两步。 第一步,准备dummy表。 需要借助一个有足够多行的dummy表,表中的内容其实没有意义,只要行数够就行。 如果没有合适的表,就自己建一个,这个准备工作做一次就够了。

MariaDB [demo]> create table dummy(id int primary key);
Query OK, 0 rows affected (0.25 sec)

MariaDB [demo]> insert into dummy values
    -> (1),
    -> (2),
    -> (3),
    -> (4),
    -> (5),
    -> (6),
    -> (7),
    -> (8),
    -> (9),
    -> (10),
    -> (11),
    -> (12),
    -> (13),
    -> (14),
    -> (15),
    -> (16),
    -> (17),
    -> (18),
    -> (19),
    -> (20),
    -> (21),
    -> (22),
    -> (23),
    -> (24),
    -> (25),
    -> (26),
    -> (27),
    -> (28),
    -> (29),
    -> (30),
    -> (31);
Query OK, 31 rows affected (0.05 sec)
Records: 31  Duplicates: 0  Warnings: 0

MariaDB [demo]> select * from dummy;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
|  8 |
|  9 |
| 10 |
| 11 |
| 12 |
| 13 |
| 14 |
| 15 |
| 16 |
| 17 |
| 18 |
| 19 |
| 20 |
| 21 |
| 22 |
| 23 |
| 24 |
| 25 |
| 26 |
| 27 |
| 28 |
| 29 |
| 30 |
| 31 |
+----+
31 rows in set (0.00 sec)
第二步,执行select 因为一个月的天数脱离具体的年是没有意义的,所以我用字符串给出了具体日期,你可以在你的程序中变通处理。

MariaDB [demo]> select * from
    ->   (select @d := date_add(@d, interval 1 day) d
    ->   from
    ->     dummy,
    ->     (select
    ->       @b := str_to_date ('2016.4.1', '%Y.%m.%d'),
    ->       @d := date_add(@b, interval -1 day),
    ->       @e := date_add(@b, interval 1 month)
    ->     ) s
    ->   ) t_d
    -> where d < @e;
+------------+
| d          |
+------------+
| 2016-04-01 |
| 2016-04-02 |
| 2016-04-03 |
| 2016-04-04 |
| 2016-04-05 |
| 2016-04-06 |
| 2016-04-07 |
| 2016-04-08 |
| 2016-04-09 |
| 2016-04-10 |
| 2016-04-11 |
| 2016-04-12 |
| 2016-04-13 |
| 2016-04-14 |
| 2016-04-15 |
| 2016-04-16 |
| 2016-04-17 |
| 2016-04-18 |
| 2016-04-19 |
| 2016-04-20 |
| 2016-04-21 |
| 2016-04-22 |
| 2016-04-23 |
| 2016-04-24 |
| 2016-04-25 |
| 2016-04-26 |
| 2016-04-27 |
| 2016-04-28 |
| 2016-04-29 |
| 2016-04-30 |
+------------+
30 rows in set (0.00 sec)
weixin_34827075 2016-04-28
  • 打赏
  • 举报
回复
最好把id 加上primary key anto_increment,这样方便通过id查date
weixin_34827075 2016-04-28
  • 打赏
  • 举报
回复
select date from (table_list) where date=‘2016-2-*’;

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧