问题
我开发了一个游戏系统,用户可以在其中执行一定数量的活动,并且他们需要使用小工具。他们被允许在游戏中间更换他们的小工具。例如,用户从一开始就使用 XBox ( 2013年11月29日)直到 2014年2月3日,现在他决定转换他的小工具 Wii 然后从我的数据库中我想根据日期为XBox和Wii获取该用户的数据。
我使用以下查询,数据库中有数据,但查询结果仍为Zero记录。任何建议都会很棒!
查询
SELECT *
FROM game_scores
WHERE username = "joe@example.com"
AND gadget_data_type = "Activity"
AND gadget_sub_data_type = "running"
AND (
gadget_name = "XBox"
AND STR_TO_DATE( date_time, "%a, %e %b %Y %H:%i:%s" ) >= STR_TO_DATE( "Fri, 29 Nov 2013 00:00:00", "%a, %e %b %Y %H:%i:%s" )
)
AND (
gadget_name = "Wii"
AND STR_TO_DATE( date_time, "%a, %e %b %Y %H:%i:%s" ) >= STR_TO_DATE( "Mon, 3 Feb 2014 00:04:46", "%a, %e %b %Y %H:%i:%s" )
)
ORDER BY df_id DESC
答案 0 :(得分:1)
如果您正在进行一系列连续日期,则无需使用IN运算符。
如果你用它来计算七天前的午夜
DATE(NOW()) - INTERVAL 7 DAY + INTERVAL 0 SECOND
这是你得到的:
mysql> SELECT DATE(NOW()) - INTERVAL 7 DAY + INTERVAL 0 SECOND;
+--------------------------------------------------+
| DATE(NOW()) - INTERVAL 7 DAY + INTERVAL 0 SECOND |
+--------------------------------------------------+
| 2012-11-21 00:00:00 |
+--------------------------------------------------+
1 row in set (0.01 sec)
mysql>
Your query will look like this:
SELECT COUNT(DISTINCT `user`) FROM `tracks`
WHERE `track_time` >= ( DATE(NOW()) - INTERVAL 7 DAY + INTERVAL 0 SECOND );
You also need an index to support the WHERE and COUNT
ALTER TABLE tracks ADD INDEX track_time_user_ndx (track_time,user);
然后,查询应该更快。
如果您正在进行一些较早期间的连续日期,只需提供从午夜到午夜的第一个和最后一个日期。例如,对于2012-11-12到2012-11-19的范围:
SELECT COUNT(DISTINCT `user`) FROM `tracks`
WHERE `track_time` >= '2012-11-12 00:00:00'
AND `track_time` < '2012-11-19 00:00:00';
If you are doing a range of non-consecutive dates, simply structure the query using UNION. For example, for dates 2012-11-12,2012-11-19,2012-11-26:
SELECT COUNT(DISTINCT `user`) FROM
(
SELECT user,track_time FROM `tracks`
WHERE `track_time` >= '2012-11-12 00:00:00'
AND `track_time` <= '2012-11-12 23:59:59'
UNION
SELECT user,track_time FROM `tracks`
WHERE `track_time` >= '2012-11-19 00:00:00'
AND `track_time` <= '2012-11-19 23:59:59'
UNION
SELECT user,track_time FROM `tracks`
WHERE `track_time` >= '2012-11-26 00:00:00'
AND `track_time` <= '2012-11-26 23:59:59'
)
答案 1 :(得分:0)
应用“或”黑白小工具类型和日期
AND Opertaor
AND运算符根据满足多个要求的要求选择行
OR opearator
“要么是”,要么是“接近。
由于这两个条件,你正在申请同一列,那么它们永远不会同时满足。
简单的手段,举一个例子
col1 col2
a 1
a 2
b 3
所以(col1 = a和col2 = 1)和(col1 = b和col2 = 3)永远不会给你任何记录。
b / c表示col1的值为a,col2的值为2,col1的值为b,col2的值为3。
它只是意味着在同一列上添加和运算符,不会产生结果。
简单的例子。
是不可能的 col1=a and col1=b