我有一些关于代理商在不同时间投票选择不同选项的数据:
+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| ID | int(10) | NO | PRI | NULL | auto_increment |
| option | varchar(50) | NO | | NULL | |
| agent | varchar(50) | NO | | NULL | |
| date | datetime | NO | | NULL | |
+------------+-------------+------+-----+---------+----------------+
现在我想输出至少 a 代理商至少在 t 日期投票的所有行,最多 o 选项。
因此,假设,例如, a = 2, t = 3, o = 1。然后我想只输出那些总计达(count)> = 3 * 2的行,其中至少3个不同的日期是2个不同代理的最多1个选项中的一个的投票。 E.g:
我正在寻找的select命令应输出:
+--------+-------+------+
| option | agent | date |
+--------+-------+------+
| opt1 | a | 1 |
| opt1 | a | 2 |
| opt1 | a | 3 |
| opt2 | b | 1 |
| opt2 | b | 2 |
| opt2 | b | 3 |
| opt1 | c | 1 |
| opt1 | c | 2 |
| opt1 | c | 3 |
+--------+-------+------+
只有代理a和c的行:
+--------+-------+------+
| opt1 | a | 1 |
| opt1 | a | 2 |
| opt1 | a | 3 |
| opt2 | b | 1 |
| opt1 | c | 1 |
| opt1 | c | 2 |
| opt1 | c | 3 |
+--------+-------+------+
有没有办法这样做或者我必须通过脚本(PHP)运行一组组合?非常感谢,Christian
答案 0 :(得分:0)
认为您需要几个子查询。一个用于获得所有选项/代理至少具有所需数量的日期,然后将其用作另一个查询的源,以查找至少具有所需数量的代理的选项数。然后将结果反馈到您的表中以获取这些选项的详细信息。
SELECT sometable.`option`, sometable.agent, sometable.date
FROM
(
SELECT `option`, COUNT(DISTINCT agent) as distinct_agents
FROM
(
SELECT `option`, agent, COUNT(DISTINCT date) AS distinct_dates
FROM sometable
GROUP BY `option`, agent
HAVING distinct_dates >= 3
) sub0
GROUP BY `option`
HAVING distinct_agents >=2
) sub1
INNER JOIN sometable
ON sub1.`option` = sometable.`option`
SQL小提琴: -