【发布时间】:2021-11-16 15:10:10
【问题描述】:
我有一张这样的桌子
CREATE TABLE `users_search_activity` (
`ID` bigint(20) UNSIGNED NOT NULL,
`user_id` int(11) NOT NULL,
`country_id` int(11) NOT NULL,
`search_keywords` text COLLATE utf8mb4_unicode_ci NOT NULL,
`date` datetime NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Dumping data for table `users_search_activity`
--
INSERT INTO `users_search_activity` (`ID`, `user_id`, `country_id`, `search_keywords`, `date`) VALUES
(1, 132, 2, 'xavie', '2021-07-13 08:20:37'),
(2, 132, 6, 'xavier', '2021-07-13 08:21:38'),
(3, 132, 5, 'xavier ins', '2021-07-13 08:21:39'),
(4, 132, 4, 'xavier ins', '2021-07-13 08:21:39'),
(5, 131, 9, 'xavier ins', '2021-07-13 08:22:12'),
(6, 132, 7, 'xavier ins', '2021-07-13 08:22:25'),
(7, 132, 8, 'xavier ins', '2021-07-13 09:24:43'),
(8, 132, 6, 'xavier ins', '2021-07-13 09:24:45'),
(9, 132, 4, 'xavier insa', '2021-07-13 09:24:47'),
(10, 131, 5, 'ins', '2021-07-13 09:24:54'),
(11, 132, 3, 'ins', '2021-07-13 09:24:54'),
(12, 132, 2, 'ins', '2021-07-13 09:24:58'),
(13, 132, 9, 'ins', '2021-07-13 09:24:59'),
(14, 132, 3, 'ins', '2021-07-13 09:25:00'),
(15, 132, 4, 'ins', '2021-07-13 09:25:02'),
(16, 132, 5, 'inst', '2021-07-13 09:58:20'),
(17, 132, 9, 'inst', '2021-07-04 09:58:25'),
(18, 132, 100, 'inst', '2021-07-07 09:58:25'),
(19, 132, 1, 'inst', '2021-07-11 09:58:26'),
(20, 132, 4, 'inst', '2021-07-12 09:58:26'),
(21, 1, 12, 'University Business Academy in Novi Sad', '2021-07-14 10:16:33');
--
-- Indexes for dumped tables
--
--
-- Indexes for table `users_search_activity`
--
ALTER TABLE `users_search_activity`
ADD PRIMARY KEY (`ID`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `users_search_activity`
--
ALTER TABLE `users_search_activity`
MODIFY `ID` bigint(21) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=21;
COMMIT;
在这里,我想根据 country_id 和日期获取用户数。所以为了实现这一点,我做了这样的 sql 查询
SELECT COUNT(user_id) as count, date(date) as date , country_id
FROM users_search_activity
WHERE country_id != ""
GROUP BY country_id
ORDER BY date DESC
在某种程度上它工作正常,但问题是它没有获得2021-07-12 日期的行。
这是我得到的输出
count date country_id
1 2021-07-14 12
3 2021-07-13 5
4 2021-07-13 4
3 2021-07-13 9
1 2021-07-13 7
1 2021-07-13 8
2 2021-07-13 3
2 2021-07-13 2
2 2021-07-13 6
1 2021-07-11 1
1 2021-07-07 100
谁能告诉我我在这里做错了什么?任何建议和建议都将是非常可观的。
仅供参考:我使用的是 MySQL 5.7
【问题讨论】:
-
查询无效。您处于 MySQL 臭名昭著的作弊模式。如果出现这种情况,请使用
SET sql_mode = 'ONLY_FULL_GROUP_BY';退出。您按国家/地区分组,这为每个国家/地区提供一行。但是您选择国家/地区的日期。每个国家的表格中真的只有一个日期吗?这听起来不太可能。您无法访问 日期;您可以选择最长日期或最短日期或您根据某些规则选择的其他日期。出于同样的原因,您也不能按日期订购。 MySQL 在作弊模式下所做的是将你的日期默默地转换为ANY_VALUE(date)。 -
如果要按国家和日期统计用户数,请按国家和日期分组。 “每 x 和 y”在 SQL 中转换为
GROUP BY x, y。 -
dbfiddle.uk/… 我所做的只是在 group by 子句中添加日期(日期),类似于@ThorstenKettner 在他的第二条评论中提到的内容......您的日期在结果中
-
@VBoka 出于某种原因,如果我使用日期db-fiddle.com/f/7yUJcuMJPncBBnrExKbzYz/46,它就不起作用,可能是因为它是一个保留字,但如果我将其视为别名,它会给出正确的结果,正如我在回答
-
附带说明:MySQL 5.7 已经很老了,在 MySQL 8 中添加了很多很棒的功能。您可能需要考虑升级。
标签: mysql sql performance