我不知道我需要使用哪种标题来解决这个问题,任何人都可以帮我选择一个标题。
无论如何我的问题是 我需要运行此查询。
SELECT key_features,about_course FROM `page_sections` WHERE page_id=15 AND country_id=241 AND state_id=291 AND city_id=1277;
如果没有找到记录。然后我需要使用city_id = 0
运行相同的查询SELECT key_features,about_course FROM `page_sections` WHERE page_id=15 AND country_id=241 AND state_id=291 AND city_id=0;
如果没有找到记录。然后我需要使用state_id = 0&&运行相同的查询city_id = 0
SELECT key_features,about_course FROM `page_sections` WHERE page_id=15 AND country_id=241 AND state_id=0 AND city_id=0;
如果没有找到记录。然后我需要使用country_id = 0和state_id = 0&&运行相同的查询city_id = 0
SELECT key_features,about_course FROM `page_sections` WHERE page_id=15 AND country_id=0 AND state_id=0 AND city_id=0;
现在有更好的方法可以从上到下运行所有这些查询,只获得一行。
我不想使用neatened if else ...
答案 0 :(得分:2)
我的简单方法是始终选择具有给定id的字段,或者为零,然后排序并限制结果。
SELECT key_features,about_course
FROM `page_sections`
WHERE page_id=15
AND (country_id=241 OR country_id=0)
AND (state_id=291 OR state_id=0)
AND (city_id=1277 OR city_id=0)
ORDER BY country_id DESC, state_id DESC, city_id DESC
LIMIT 1;
答案 1 :(得分:1)
嗯。如果你想要一行,那怎么样:
SELECT key_features, about_course
FROM `page_sections`
WHERE page_id = 15 AND country_id = 241 AND state_id = 291 AND city_id = 1277
UNION ALL
SELECT key_features, about_course
FROM `page_sections`
WHERE page_id = 15 AND country_id = 241 AND state_id = 291 AND city_id = 0
UNION ALL
SELECT key_features, about_course
FROM `page_sections`
WHERE page_id = 15 AND country_id = 241 AND state_id = 0 AND city_id = 0
UNION ALL
SELECT key_features, about_course
FROM `page_sections`
WHERE page_id = 15 AND country_id = 0 AND state_id = 0 AND city_id = 0
ORDER BY country_id DESC, state_id DESC city_id DESC
LIMIT 1;
(这假设id都是非负的,这似乎是一个合理的假设。)
我使用UNION ALL
而不是OR
的原因是子查询都可以利用page_sections(page_id, country_id, state_id, city_id)
上的索引。使用OR
可能会排除使用索引。
假设每个条件只有一个(或少数匹配),这将比任何原始查询慢一点。但是,它可能比多次往返数据库更快。
编辑:
傻傻的我。在MySQL中,这是编写查询的最佳方式:SELECT key_features, about_course
FROM `page_sections`
WHERE (page_id, country_id, state_id, city_id) IN
( (15, 241, 291, 1277),
(15, 241, 291, 0),
(15, 241, 0, 0),
(15, 0, 0, 0)
)
ORDER BY country_id DESC, state_id DESC city_id DESC
LIMIT 1;
答案 2 :(得分:1)
也许是这样的?
SELECT
key_features,
about_course
FROM
page_sections
WHERE
page_id = 15
ORDER BY
city_id DESC,
state_id DESC,
country_id DESC
LIMIT 1;
因为LIMIT 1
你只会获得一行。诀窍是订购。我假设零是country_id
,state_id
和city_id
字段中的最小数字,因此任何更高的数字都应该首先显示在结果中。
编辑:我根据您的要求删除了对特定country_id
,state_id
和city_id
字段的选择。