【问题标题】:custom SQL query not getting all the rows自定义 SQL 查询未获取所有行
【发布时间】: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


【解决方案1】:

试试:

SELECT          count(user_id) as count, 
                   date(`date`) as the_date, 
                             country_id 
FROM users_search_activity 
WHERE country_id != "" 
GROUP BY the_date,country_id
ORDER BY the_date DESC ;

演示:https://www.db-fiddle.com/f/7yUJcuMJPncBBnrExKbzYz/45

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多