Извлекает строки либо с одним подходящим условием, либо со всеми строками, если нет совпадающих строк - PullRequest
0 голосов
/ 19 марта 2020

У меня есть простая таблица

**targeted_url_redirect   targeted_countries        msg_type    non_targeted_url**
http://new.botweet.com    india,nepal,philippines   NEW         http://twisend.com
http://expapers.com       United States,Canada      OLD         http://all.twisend.com
https://tweeasy.com       india,england             OLD         http://all.twisend.com

Я получаю трафик на своем веб-сайте followerise.com и хочу перенаправить пользователей на указанные c URL-адреса в зависимости от их стран, как определено в приведенной выше таблице. Я могу написать запрос, чтобы получить строки для пользователей из целевых стран, которые хранятся в моей базе данных. Но я ищу решение, чтобы получить все строки, если условие targeted_countries не возвращает никаких строк.

Я написал ниже запросов.

SELECT * FROM tweeasy_website_redirection
WHERE message_type='OLD'
  AND targeted_countries LIKE '%@country%'

Этот запрос дает мне нужные строки, если посетитель из стран india, england, United States, Canada

Но я хочу, чтобы все строки (2-й и 3-й) были выбраны, если пользователь из стран, не указанных в targeted_countries column.

Также дайте мне знать, если мне нужно реструктурировать эту таблицу в 2 или более таблиц, чтобы получить желаемый результат.

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Одна опция использует not exists:

SELECT t.* 
FROM tweeasy_website_redirection t
WHERE 
    t.message_type = 'OLD' 
    AND (
        t.targeted_countries LIKE '%@country%'
        OR NOT EXISTS (
            SELECT 1 
            FROM tweeasy_website_redirection t1
            WHERE t1.targeted_countries LIKE '%@country%'
        )
    )

Когда дело доходит до структуры вашей таблицы: один недостаток дизайна - хранить список значений в виде списка CSV. У вас должно быть две отдельные таблицы: одна для хранения URL-адресов, а другая для хранения отношения 1-N между URL-адресами и странами. Что-то вроде:

table "url"
id    targeted_url_redirect     msg_type    non_targeted_url
 1    http://new.botweet.com    NEW         http://twisend.com
 2    http://expapers.com       OLD         http://all.twisend.com
 3    https://tweeasy.com       OLD         http://all.twisend.com

table "url_countries"
url_id    country
1         india
1         nepal
1         philippines
2         united states
2         canada
3         india
3         england
0 голосов
/ 19 марта 2020

выберите * из tweeasy_website_redirection, где target_countries отсутствует в (ВЫБРАТЬ target_countries ОТ стека WHERE target_countries LIKE '% @ country%')

...