столбец присоединения mysql из другой таблицы на разных условиях

У меня есть таблица "прейскурант". Я пытаюсь присоединиться к одному столбцу, new_rate, из другой таблицы под названием «rate_cycles», и это должно основываться на определенных условиях. У меня проблемы с созданием такого запроса. Таблица прайс-листа содержит префиксы, вот образцы из обеих таблиц. Я присоединяюсь к 'new_rate' из циклов, если пара страна + регион из прайс-листа совпадает.

Если (в таблице циклов) префикс равен нулю и уведомлен 0, мне нужно присоединиться к «new_rate» из этой строки. Если он уведомлен (уведомлен = 1), мне нужно найти, если он существует, следующую строку, где уведомление равно 0. Если в этой строке префикс равен нулю, то я присоединяюсь к new_rate из этой строки, но если префикс не равен нулю, то для значения new_rate мне нужна последняя строка, где префикс равен нулю, а уведомление равно 1 (если существует, если нет, то нуль).

Как я мог этого добиться? Спасибо.

Таблица цен

+----+--------------+---------+--------------+---------+-----------+----------+-----------+----------+--------+---------------------+----------------+
| id | pricelist_id | country | region       | prefix  | is_mobile | is_fixed | is_custom | currency | rate   | last_updated        | has_rate_cycle |
+----+--------------+---------+--------------+---------+-----------+----------+-----------+----------+--------+---------------------+----------------+
|  2 |            1 | Albania | Fixed ALBTEL | 3554249 |         0 |        0 |         0 | USD      | 0.0000 | 2014-09-23 09:48:00 |              1 |
|  3 |            1 | Albania | Fixed ALBTEL | 3554250 |         0 |        0 |         0 | USD      | 0.0000 | 2014-09-23 09:48:00 |              1 |
|  4 |            1 | Albania | Fixed ALBTEL | 3554251 |         0 |        0 |         0 | USD      | 0.0000 | 2014-09-23 09:48:00 |              1 |
|  5 |            1 | Albania | Fixed ALBTEL | 3554252 |         0 |        0 |         0 | USD      | 0.0000 | 2014-09-23 09:48:00 |              1 |
+----+--------------+---------+--------------+---------+-----------+----------+-----------+----------+--------+---------------------+----------------+

Таблица циклов

+----+------------+---------+--------------+----------+---------------------+---------------+---------+----------+---------+
| id | carrier_id | country | region       | new_rate | activation_date     | update_status | prefix  | notified | grouped |
+----+------------+---------+--------------+----------+---------------------+---------------+---------+----------+---------+
|  1 |         15 | Albania | Fixed ALBTEL |   1.0000 | 2014-09-30 03:48:00 | NEW           | NULL    |        0 |       0 |
|  2 |         15 | Albania | Fixed ALBTEL |   2.0000 | 2014-10-01 03:48:00 | BLOCKED       | 3554250 |        0 |       0 |
|  3 |         15 | Albania | Fixed ALBTEL |   3.0000 | 2014-10-02 03:48:00 | DECREASE      | NULL    |        0 |       0 |
|  4 |         15 | Albania | Fixed ALBTEL |   4.0000 | 2014-10-03 03:48:00 | NEW           | 3554250 |        0 |       0 |
+----+------------+---------+--------------+----------+---------------------+---------------+---------+----------+---------+

person infinite    schedule 29.09.2014    source источник
comment
Если хотите, рассмотрите следующий простой двухэтапный план действий: 1. Если вы еще этого не сделали, предоставьте правильные DDL (и/или sqlfiddle), чтобы нам было легче воспроизвести проблему. 2. Если вы еще этого не сделали, укажите желаемый набор результатов, соответствующий информации, предоставленной на шаге 1.   -  person Strawberry    schedule 29.09.2014
comment
@Strawberry, спасибо, буду. Я создам схему в sqlfiddle.   -  person infinite    schedule 29.09.2014
comment
Не забывайте, что этот план действий состоит из двух шагов!   -  person Strawberry    schedule 29.09.2014
comment
sqlfiddle.com/#!8/ee223/1 вот скрипка, что делать Вы имеете в виду, пожалуйста, вторым шагом?   -  person infinite    schedule 29.09.2014


Ответы (1)


Это был сложный запрос, и мне удалось сделать то, что мне нужно. Было бы здорово, если бы его можно было немного упростить. Делюсь своим решением.

SELECT p.id,p.country, p.region, p.prefix, p.currency, p.rate,

    (SELECT CASE WHEN notified = 0

    THEN    (SELECT CASE WHEN prefix IS NULL
        THEN new_rate
        ELSE    (SELECT CASE WHEN COUNT(new_rate)>0
                THEN (SELECT new_rate FROM pricelist_rates_cycle WHERE country=p.country and region=p.region and notified=1 and prefix is null order by DATE(activation_date) DESC LIMIT 1)
                ELSE NULL
                END
                FROM pricelist_rates_cycle WHERE country=p.country and region=p.region and notified=1 and prefix is null
                )
        END
        FROM pricelist_rates_cycle WHERE country=p.country and region=p.region and notified=0 LIMIT 1)

    ELSE (
            SELECT CASE WHEN COUNT(new_rate)>0
            THEN IF( prefix is null, new_rate,
                    (SELECT new_rate FROM pricelist_rates_cycle WHERE country=p.country and region=p.region and notified=1 and prefix is null order by DATE(activation_date) DESC LIMIT 1)
                    )
            ELSE (SELECT new_rate FROM pricelist_rates_cycle WHERE country=p.country and region=p.region and notified=1 and prefix is null order by DATE(activation_date) DESC LIMIT 1)
            END
            FROM pricelist_rates_cycle WHERE country=p.country and region=p.region and notified=0
         )
    END
    FROM pricelist_rates_cycle WHERE country=p.country and region=p.region LIMIT 1) AS new_rate

FROM pricelist_15 AS p ORDER BY country, region ASC
person infinite    schedule 29.09.2014