Как ограничить ПРАВУЮ таблицу в левом соединении одной строкой (с предпочтением конкретной строки)?

Если кто-то может помочь, это будет высоко ценится.

Проблема в том, что я не могу ссылаться ни на что, кроме подзапроса!?

SELECT * FROM currentcalls AS c
LEFT JOIN custprices ON c.rateid = custprices.rateid
LEFT JOIN (SELECT * FROM costprices 
    WHERE costprices.ratetype = custprices.ratetype
      AND (costprices.providerid = c.providerid OR costprices.providerid=0)
    ORDER BY costprices.providerid DESC LIMIT 1) AS new1 ON new1.ratetype = custprices.ratetype

3 таблицы:

currentcalls (rateid, providerid)
custprices (rateid, ratetype)
costprices (ratetype,providerid)

Мы хотим, чтобы ВСЕ строки были от текущих звонков, а одна строка - от стоимости и себестоимости. У Rateid есть уникальная строка, так что custprices - это хорошо.

Однако, к сожалению, цена для конкретного Provrid может не существовать (в этом случае я хочу использовать Provrid=0), или если он существует, то я не хочу результатов ProvidID = 0. В любом случае, я не хочу возвращать несколько строк (из costprice).

SAMPLE DATA (информация о ценах представляет несколько полей, которые я хочу выбрать)

currentcalls (rateid, providerid)
              345       2
custprices (rateid, ratetype)
              345     123
costprices (ratetype,providerid, pricing_information)
              123       0           ????A
              123       1           ????B
              123       2           ????C
              123       3           ????D

Я хочу, чтобы результат был:

rateid,providerid,rateid,ratetype,ratetype,providerid,pricing_information
  345      2       345     123     123       2           ??????C

И если Provider не существует, то результат должен быть

  345      2       345     123     123       0           ??????A

(Для каждой строки в текущей таблице вызовов должен быть только 1 экземпляр custprices, что легко, потому что идентификатор уникален, но проблема в том, чтобы получить только ОДИН экземпляр instanceing_information, относящийся к ProviderID и RateType)

1 ответ

Решение

Попробуй,

SELECT  c.rateid, 
        c.providerid, 
        new1.ratetype, 
        new1.pricing_information
FROM    currentcalls AS c
        LEFT JOIN custprices d
            ON c.rateid = d.rateid
        LEFT JOIN 
        (
            SELECT  a.*
            FROM    costprices a
                    INNER JOIN
                    (
                        SELECT  ratetype, MAX(x.providerid) min_provid
                        FROM    costprices x
                                INNER JOIN currentcalls y
                                  ON x.providerid IN (y.providerid, 0)
                    ) b ON  a.ratetype = b.ratetype AND
                            a.providerid = b.min_provid
        ) AS new1 ON new1.ratetype = d.ratetype;
Другие вопросы по тегам