2011-04-14 66 views
0

我有以下查询,它得到第一个结果“编辑:每个联系人”,因为我想,但我不需要任何其他结果后每个联系人。所以举个例子,如果他们有3个电话号码,一个是主要的,它给了我主要的,然后是另一个2.我尝试了分组,但最终无论是否主要都会得到第一个。任何想法如何我可以做到这一点,而不做一个PHP检查循环,如果联系已经存在?mysql在哪里条件优先

SELECT pc.firstname, pc.lastname, pp.areacode, pp.prefix, pp.last4 
, if(pc.mainphone = pp.phoneid,1,0) as phone_priority 
FROM contacts pc 
JOIN phone pp ON ((pp.contid = pc.contid && pp.phoneid = pc.mainphone) || (pp.contid = pc.contid)) 
ORDER BY pc.lastname ASC, pc.firstname ASC, phone_priority DESC 

表设置:

 
contacts (id, firstname, lastname, mainphone) 
phone (id, areacode, prefix, last4) 

使用MySQL 4.

+0

不能使用限制。我需要了解联系人的完整列表。 – David 2011-04-14 13:36:54

+0

JOIN或LEFT JOIN;由于||而没有区别“或”声明部分 – David 2011-04-14 13:38:51

+0

使用左连接时删除||部分标准。 – Chandu 2011-04-14 13:40:05

回答

1

使用LIMIT表达式来缩小结果集下降到第一结果。有关详细信息,请参阅SELECT Syntax

+0

不应该这是一个评论? – 2011-04-14 13:26:38

+1

号您为什么认为这应该是一个评论? – Oswald 2011-04-14 13:27:24

+0

@Shakti:我同意Oswald。虽然有时候发布可能有助于评论的链接是合适的,但如果它实际上是对问题的回答,则应将其作为答案发布,以便将其标记为答案。使来到页面的其他人能够更轻松地立即找到答案,而无需通读非相关文本。 – FreeAsInBeer 2011-04-14 13:32:05

1

使用LIMIT 1在查询结束

0

使用左连接:

SELECT pc.firstname, 
    pc.lastname, 
    pp.areacode, 
    pp.prefix, 
    pp.last4 , 
    CASE 
     WHEN pp.mainphone IS NULL THEN 0 
     ELSE 1 
END AS phone_priority 
FROM contacts pc LEFT JOIN phone pp 
    ON pp.contid = pc.contid 
AND pp.phoneid = pc.mainphone 
ORDER BY pc.lastname ASC, pc.firstname ASC, phone_priority DESC 
+0

如果main不存在但手机存在,我仍然需要拔出电话。所以首先检查主要存在,如果没有得到任何电话,否则没有电话。正如我所说的查询工作,它只是拉主,然后是非主电源。我需要限制每次联系一个结果。如果主要它是列出的,如果不是哪一个电话先到。谢谢 – David 2011-04-14 13:51:48

0

试试这个变种 -

SELECT t.contid 
    , t.firstname 
    , t.lastname 
    , if(t.phoneid IS NULL, p2.phoneid, t.phoneid) phone 
    , if(t.phoneid IS NULL, p2.areacode, t.areacode) areacode 
    , if(t.phoneid IS NULL, p2.prefix, t.prefix) prefix 
    , if(t.phoneid IS NULL, p2.last4, t.last4) last4 

FROM 
    (
    SELECT c.contid 
     , c.firstname 
     , c.lastname 
     , c.mainphone 
     , p.phoneid 
     , p.areacode 
     , p.prefix 
     , p.last4 

    FROM 
    contacts c 
    LEFT JOIN phone p 
    ON c.contid = p.contid AND c.mainphone = p.phoneid) t 
LEFT JOIN phone p2 
    ON t.contid = p2.contid AND t.mainphone <> p2.phoneid 
GROUP BY 
    t.contid