具有复杂逻辑的MYSQL选择查询

时间:2014-06-18 11:28:50

标签: php mysql

我有一些关于代理商在不同时间投票选择不同选项的数据:

+------------+-------------+------+-----+---------+----------------+
| 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

1 个答案:

答案 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小提琴: -

http://www.sqlfiddle.com/#!2/2e357/2