【问题标题】:MySQL - How can I use left join to get exactly one row from a joined table in the on clause?MySQL - 如何使用左连接从 on 子句中的连接表中准确获取一行?
【发布时间】:2012-08-11 06:36:53
【问题描述】:

我希望问题足够清楚。

这是我的查询:

SELECT
    'Total Complete' AS name, count(c.id) AS amnt
FROM
    lanes AS c
      LEFT JOIN leads AS l
        ON ((c.carrier_mcn = l.authority_number
              AND l.authority_type = 'mc')
          OR c.carrier_mcn = l.mcn
          OR c.carrier_mcn = CONCAT('MC', l.authority_number))
          AND c.carrier_mcn <> 0
  LEFT JOIN lanes_emails AS cem1
    ON cem1.cid = c.id AND cem1.deleted = 0
  LEFT JOIN lanes_emails AS cem2
    ON cem1.cid = cem2.cid AND cem2.deleted = 0 AND cem2.id < cem1.id
  LEFT JOIN lanes_equipment AS ceq1
    ON ceq1.cid = c.id AND ceq1.deleted = 0
  LEFT JOIN lanes_equipment AS ceq2
    ON ceq1.cid = ceq2.cid AND ceq1.deleted = 0 AND ceq2.id < ceq1.id
  LEFT JOIN lanes_service_area AS csa1
    ON csa1.cid = c.id AND AND flag = 2 csa1.deleted = 0
  LEFT JOIN lanes_service_area AS csa2
    ON csa1.cid = csa2.cid AND AND flag = 2 csa1.deleted = 0 AND csa2.id < csa1.id
WHERE
    c.carrier_mcn IS NOT NULL and c.carrier_mcn <> ''
    AND c.broker_mcn IS NOT NULL and c.broker_mcn <> ''
    AND c.fax IS NOT NULL and c.fax <> ''
    AND cem2.id IS NOT NULL
    AND ceq2.id IS NOT NULL
    AND csa2.id IS NOT NULL

现在我在这里要做的是从“通道”中获取总行数,其中至少有一个电子邮件、设备、服务区域、mc 号码或传真号码。有两个 MC 编号,但它们都在同一张桌子上;主要问题是可以有无限的电子邮件、设备和服务区域。

在这种情况下,我开始写一篇关于这个问题的文章,发现另一个类似的问题:

MySQL: Can I do a left join and pull only one row from the join table?

所以我尝试了它并将其实现到我的查询中。不幸的是,它没有按照我的计划进行。

如果我有不止一排,它会很好用;它会得到正确的计数,忽略我有多个电子邮件或诸如此类的事实,但如果只有一个,它就行不通。相反,它没有返回任何结果。

不,我不能使用 GROUP BY 来获得我需要的结果;我尝试过 GROUP BY,我喜欢在返回完整结果列表时使用它,但如果我尝试返回计数 GROUP BY 会反复弄乱我。

有什么方法可以强制 mysql 中的连接只返回一行而不使用子查询?我只需要知道这些其他表中是否有一个项目,我不需要返回所有内容,而且我不知道如何对其进行编程以通过 WHERE 子句工作。

我需要此查询来获取条形图。我实际上有几个这样的查询;这个是需要所有结果的,但我有其他没有要求,至少一封电子邮件,至少一个 mc 号码等,但如果我能得到这个工作,我可以让其余的工作。

【问题讨论】:

    标签: mysql sql left-join


    【解决方案1】:

    您可以使用exists 子句:

    where   exists 
            (
            select  *
            from    lanes_emails AS cem1
            where   cem1.cid = c.id 
                    and cem1.deleted = 0
            )
            and exists
            ...
    

    【讨论】:

    • 我从未听说过存在子句。 -_- 好吧,我会看看这是否可行。感谢您的提示。
    • 想起来了,直到现在我才注意到它在主查询的 WHERE 子句中。我不认为有一种方法可以完全在 WHERE 子句中完成我需要的操作,但我会尝试一下,看看它是否有效。
    • 嗯,这似乎工作正常。如果可能的话,我希望能在加入中做正确的事情,但只要我让它工作,好吧,没问题。我只是不认为我可以让它在主查询的 WHERE 子句中控制它...
    猜你喜欢
    • 1970-01-01
    • 2012-06-14
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多