【发布时间】:2021-04-01 02:21:54
【问题描述】:
我有一个这样定义的表(MySQL 5.1):
CREATE TABLE mysql_test_a (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_date TIMESTAMP
);
样本数据集:
INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`, `reg_date`) VALUES ('1', 'Marcello', 'Santucci', 'marcello@tux.net', CURRENT_TIMESTAMP);
INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`, `reg_date`) VALUES ('2', 'Mike', 'Santucci', 'mike@tux.net', CURRENT_TIMESTAMP);
INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`, `reg_date`) VALUES ('3', 'Anna Maria', 'Gabriele', 'anna.maria@gabriele.net', CURRENT_TIMESTAMP);
INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`, `reg_date`) VALUES ('4', 'Matilde Josefa', 'Santucci', 'matilde.josefa@tux.net', CURRENT_TIMESTAMP);
INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`, `reg_date`) VALUES ('5', 'Milena', 'Santucci', 'mile@tux.net', CURRENT_TIMESTAMP);
INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`, `reg_date`) VALUES ('6', 'Luca', 'Pensa', 'luca@pensa.net', CURRENT_TIMESTAMP);
INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`, `reg_date`) VALUES ('7', 'Lorenzo', 'Pensa', 'lo@pensa.net', CURRENT_TIMESTAMP);
仅当记录数大于某个定义的限制(假设为 2)时,我才需要显示符合特定条件的记录(假设 lastname = 'Santucci')。
我尝试了各种方式但没有成功,最有希望的形式是:
SELECT
id,
firstname,
lastname
FROM
mysql_test_a
WHERE
lastname = 'Santucci'
HAVING COUNT(*) > 2
它只返回第一条记录。
我更喜欢使用这种形式,因为 HAVING 子句可以使用参数。
--- 最新更新 ---
我必须更具体地说明解决方案:我正在寻找不涉及内部 SELECT 的东西,更具体地说是它的 WHERE 子句,因为正如我所指出的那样,所提供的那个是相当假的(即它可能与此完全不同,而且要复杂得多)。当然,我很感激任何其他提示。
【问题讨论】:
-
让我解释一下您的查询出了什么问题:您正在使用没有
GROUP BY的聚合函数 (COUNT)。这意味着您将数据聚合到单个结果行中。由于可以有多个“Santucci”,这意味着多个 id 和 firstname。因此,您应该无法选择一个 ID 和名字。查询无效,MySQL 应该引发异常,但不会(由于不幸的 ONLY_FULL_GROUP_BY 设置)。它从行中任意选择一个 id 和 firstname。
标签: mysql sql count subquery mysql-5.1