2014-06-18 119 views
0

我对代理商在不同的时间不同的选择,投票的一些数据: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 |    | 
+------------+-------------+------+-----+---------+----------------+ 

现在我想输出,其中至少一个代理投票至少所有行在日期最多Ø选项之一。

所以,假设,例如,一个 = 2, = 3,Ô = 1。然后我想只输出那些行,其总和达到(计数)> = 3 * 2,并且其中至少3个不同的日期是的2名不同剂至多1个选项之一分组表决。例如:

的选择命令我正在寻找应该输出:

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

只有代理的行和c:

+--------+-------+------+ 
| opt1 | a | 1 | 
| opt1 | a | 2 | 
| opt1 | a | 3 | 
| opt2 | b | 1 | 
| opt1 | c | 1 | 
| opt1 | c | 2 | 
| opt1 | c | 3 | 
+--------+-------+------+ 

有没有办法这样做或做我必须通过脚本(PHP)运行一组组合?非常感谢,基督教

+1

我有些由您的要求混为一谈。你能否在你的描述中多加几个阶段。我看不出为什么代理商b一次都在最终结果中,他们的所有条目看起来都是相同的,还是只有那里存在拼写错误? – Kickstart

+0

这是我的困惑点:“至少投在t日期最多O选项之一。”是0的错字? –

+0

感谢您的意见! @Kickstart:我很抱歉 - 输出中包含代理b的行不正确。广告Len_D:“o”代表选项的数量。其实,我可以简化查询,我需要如下背后的逻辑:显示所有的行,以便为_a * T_行有代理_A1,...,Aa_,红枣_T1,...,TT_和选项_O1 .. Oo_,以便每个代理选择_O1,...,Oo_选项中的一个日期。 ... – Christian

回答

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