如何在单个查询中运行多个查询

时间:2017-03-17 12:28:43

标签: php mysql

我不知道我需要使用哪种标题来解决这个问题,任何人都可以帮我选择一个标题。

无论如何我的问题是 我需要运行此查询。

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 ...

  • 如果第一次查询工作不需要运行第二次
  • else如果第二次查询工作不需要运行第三次
  • 如果第三次查询工作不需要运行fouth

3 个答案:

答案 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_idstate_idcity_id字段中的最小数字,因此任何更高的数字都应该首先显示在结果中。

编辑:我根据您的要求删除了对特定country_idstate_idcity_id字段的选择。