首页 > 解决方案 > 如果没有匹配的行,则获取具有一个匹配条件的行或所有行

问题描述

我有一张简单的桌子

**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我想根据上表中定义的国家/地区将用户重定向到特定的 URL。我可以编写查询来获取来自目标国家/地区的用户的行,这些目标存储在我的数据库中。targeted_countries但是如果条件不返回任何行,我正在寻找一种解决方案来获取所有行。

我在下面写了查询。

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

如果访问者来自国家india, england, United States,此查询为我提供所需的行Canada

但是,如果用户来自targeted_countries列中未指定的国家/地区,我希望获取所有行(第 2 行和第 3 行)。

如果我需要将此表重组为 2 个或更多表以获得所需的结果,还请告诉我。

标签: mysqlsqlselectwhere-clause

解决方案


一种选择使用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,另一个用于存储 url 和国家/地区之间的 1-N 关系。就像是:

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

推荐阅读