2011-11-16 102 views
0

我试图命令分组结果集。问题是其中一个连接条件引用另一个表。具体来说,我需要从table_a中选择组中具有最高值的记录,但组标识是不同表中的字段。当连接条件在其他表中时MySQL排除连接

下面是我试过的一些东西,不同的变化。每当我添加GROUP BY pr.id时,知道的一些结果应该排在前3位。当我不添加它时,我每组获得1个以上的记录。

任何帮助非常感谢。

SELECT * FROM ivalues AS iv 

INNER JOIN mprod AS p ON (p.id = iv.p_id) 
INNER JOIN contact AS pr ON (pr.id = p.pr_id) 


LEFT OUTER JOIN ivalues i2 
    ON i2.p_id = p2.id 

    AND i2.period = iv.period 
    AND i2.current = iv.current 
    AND i2.cert = iv.cert 
    AND i2.exists = iv.exists 
    AND iv.value > i2.value 
WHERE 
iv.period = 0 
AND iv.current = 1 
AND iv.cert = 1 
AND p.type_id = 15747 
AND iv.exists = 1 
AND i2.id IS NULL 
GROUP BY pr.id 
ORDER BY iv.value ASC 
LIMIT 10; 

SELECT * FROM ivalues AS iv 

INNER JOIN mprod AS p ON (p.id = iv.p_id) 
INNER JOIN contact AS pr ON (pr.id = p.pr_id) 

LEFT OUTER JOIN contact pr2 
    ON pr2.id = p.pr_id 

LEFT OUTER JOIN mprod p2 
    ON p2.type_id = p.type_id   

LEFT OUTER JOIN ivalues i2 
    ON i2.p_id = p2.id 

    AND i2.period = iv.period 
    AND i2.current = iv.current 
    AND i2.cert = iv.cert 
    AND i2.exists = iv.exists 
    AND iv.value > i2.value 
WHERE 
iv.period = 0 
AND iv.current = 1 
AND iv.cert = 1 
AND p.type_id = 15747 
AND iv.exists = 1 
AND i2.id IS NULL 

ORDER BY iv.value ASC 
LIMIT 10; 

SELECT * FROM ivalues AS iv 

INNER JOIN mprod AS p ON (p.id = iv.p_id) 
INNER JOIN contact AS pr ON (pr.id = p.pr_id) 

LEFT OUTER JOIN contact p2 
    ON p2.pr_id = p.pr_id 
    AND p2.type_id = p.type_id 

INNER JOIN mprod p2 
    ON p2.type_id = p.type_id   

INNER JOIN ivalues i2 
    ON i2.p_id = p2.id 

    AND i2.period = iv.period 
    AND i2.current = iv.current 
    AND i2.cert = iv.cert 
    AND i2.exists = iv.exists 
    AND iv.value > i2.value 

WHERE 
iv.period = 0 
AND iv.current = 1 
AND iv.cert = 1 
AND p.type_id = 15747 
AND iv.exists = 1 

ORDER BY iv.value ASC 
LIMIT 3; 

回答

0

我想你会需要加入ivalues和mprod作为一个子查询,无论是作为外连接排除非最大值,或作为内部组找到的最大值。希望它看起来像这样:

SELECT * FROM contact 
    INNER JOIN mprod ON mprod.contact_id = contact.id 
    INNER JOIN ivalues ON ivalues.mprod_id = mprod.id 
    LEFT OUTER JOIN (
    SELECT mprod.contact_id, ivalues.* 
     FROM mprod 
     INNER JOIN ivalues ON mprod.id = ivalues.mprod_id 
     WHERE ivalues.period = 0 
     AND ivalues.current = 1 
     AND ivalues.cert = 1 
     AND mprod.type_id = 15747 
     AND ivalues.exists = 1 
) AS pv ON pv.contact_id = contact.id AND pv.value > ivalues.value 
    WHERE ivalues.period = 0 
    AND ivalues.current = 1 
    AND ivalues.cert = 1 
    AND mprod.type_id = 15747 
    AND ivalues.exists = 1 
    AND pv.id IS NULL 
    GROUP BY pr.id 
    ORDER BY iv.value ASC 
    LIMIT 10; 
+0

是否有窍门。我只是想创建一个加入的视图,我不会想到这样做的子选择。谢谢。 – user1050499

+0

我意识到我拼写了'GROUP BY',但现在我想知道它是否有必要... – Neil