MySQL. Как я могу использовать левое соединение, чтобы получить ровно одну строку из объединенной таблицы в предложении on?

Я надеюсь, что вопрос достаточно ясен.

Вот мой запрос:

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: Могу ли я выполнить левое соединение и извлечь только одну строку из таблицы соединений?

Поэтому я попробовал это и внедрил в свой запрос. К сожалению, это не сработало так, как я планировал.

Это сработало бы нормально, если бы у меня было более одной строки; он получит правильный подсчет, игнорируя тот факт, что у меня было несколько электронных писем или что-то еще, но это НЕ сработало бы, если бы было только одно. Вместо этого он не дал никаких результатов.

Нет, я не могу использовать GROUP BY для получения нужных мне результатов; Я пробовал GROUP BY, мне нравится использовать его при возврате полных списков результатов, но если я пытаюсь вернуть счетчики, GROUP BY постоянно путает меня.

Есть ли способ заставить объединение в mysql вернуть только одну строку без использования подзапроса? Мне нужно только знать, есть ли один элемент из любой из этих других таблиц, мне не нужно возвращать все, и я не знаю, как запрограммировать его для работы через предложение WHERE.

Мне нужен этот запрос для гистограммы. На самом деле у меня есть несколько таких запросов; это тот, который требует всех результатов, но у меня есть другие без требований, по крайней мере, один адрес электронной почты, по крайней мере, один номер MC и т. д., но если я смогу заставить это работать, я могу заставить работать остальные.


person JaidynReiman    schedule 11.08.2012    source источник


Ответы (1)


Вы можете использовать предложение exists:

where   exists 
        (
        select  *
        from    lanes_emails AS cem1
        where   cem1.cid = c.id 
                and cem1.deleted = 0
        )
        and exists
        ...
person Andomar    schedule 11.08.2012
comment
Я даже никогда не слышал о предложении exists. -_- Хорошо, я посмотрю и посмотрю, сработает ли это. Спасибо за совет. - person JaidynReiman; 11.08.2012
comment
Если подумать, я до сих пор не замечал, что это было в предложении WHERE основного запроса. Я не думал, что есть способ сделать то, что мне нужно, полностью в предложении WHERE, но я попробую это и посмотрю, сработает ли это. - person JaidynReiman; 12.08.2012
comment
Ну, это, кажется, работает нормально. Я надеялся сделать это прямо в соединении, если это возможно, но пока я заставлю его работать, хорошо, никаких проблем. Я просто не думал, что смогу заставить его работать, контролируя все это в предложении WHERE основного запроса... - person JaidynReiman; 12.08.2012