Как ограничить ПРАВУЮ таблицу в левом соединении одной строкой (с предпочтением конкретной строки)?
Если кто-то может помочь, это будет высоко ценится.
Проблема в том, что я не могу ссылаться ни на что, кроме подзапроса!?
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;