我对组合 MySQL 查询有点困惑。它是多语言、多目的地网站的一部分,因此我需要从多个表中检索网站的一些文本部分,并进行回退。可能的命中顺序:
corrected@local_tbl > english@local_tbl > corrected@global_tbl > english@global_tbl.
因为它将被高度使用,所以我希望保持快速且连接数较少,但仅返回 1 行。我尝试了以下几种方法,但我确信有更好的解决方案。
<小时/>FROM 子句中的子查询:如果任何子查询给出 0 行,则子查询终止。即使它有效,也需要一些 php 解释:
SELECT * FROM
(SELECT `sp_content` AS sp_local FROM `loc-ae_siteparts` WHERE `sp_name` = 'name_of_some_sitepart' AND `sp_lang` = 'de' AND `sp_corrected`='1' LIMIT 1) as local,
(SELECT `sp_content` AS sp_local_en FROM `loc-ae_siteparts` WHERE `sp_name` = 'name_of_some_sitepart' AND `sp_lang` = 'en' LIMIT 1) as local_en,
(SELECT `sp_content` AS sp_global, `sp_corrected` as sp_global_corrected FROM `loc-global_siteparts` WHERE `sp_name` = 'name_of_some_sitepart' AND `sp_lang` = 'de' LIMIT 1) as global,
(SELECT `sp_content` AS sp_global_en FROM `loc-global_siteparts` WHERE `sp_name` = 'name_of_some_sitepart' AND `sp_lang` = 'en' LIMIT 1) as global_en
<小时/>
TEMP表:这里我担心性能,不能使用内存引擎,因为它涉及到文本字段。为了小鸟而浪费核武器?
CREATE TEMPORARY TABLE IF NOT EXISTS `random_tbl_name` AS (SELECT `sp_content` FROM `loc-global_siteparts` LIMIT 0);
INSERT INTO `random_tbl_name` SELECT `sp_content` FROM `loc-ae_siteparts` WHERE `sp_name` = 'name_of_some_sitepart' AND `sp_lang` = 'de' AND `sp_corrected` = '1' LIMIT 1;
INSERT INTO `random_tbl_name` SELECT `sp_content` FROM `loc-ae_siteparts` WHERE `sp_name` = 'name_of_some_sitepart' AND `sp_lang` = 'en' LIMIT 1;
INSERT INTO `random_tbl_name` SELECT `sp_content` FROM `loc-global_siteparts` WHERE `sp_name` = 'name_of_some_sitepart' AND `sp_lang` = 'de' AND `sp_corrected` = '1' LIMIT 1;
INSERT INTO `random_tbl_name` SELECT `sp_content` FROM `loc-global_siteparts` WHERE `sp_name` = 'name_of_some_sitepart' AND `sp_lang` = 'en' LIMIT 1;
SELECT * FROM `random_tbl_name` LIMIT 1;
编辑:感谢您的所有回答,它们非常有帮助。
最佳答案
SELECT * FROM
((SELECT 1 precedence, `sp_content`
FROM `loc-ae_siteparts`
WHERE `sp_name` = 'name_of_some_sitepart' AND `sp_lang` = 'de' AND `sp_corrected`='1'
LIMIT 1)
UNION
(SELECT 2 precedence, `sp_content`
FROM `loc-ae_siteparts`
WHERE `sp_name` = 'name_of_some_sitepart' AND `sp_lang` = 'en'
LIMIT 1)
UNION
...
) x
ORDER BY precedence
LIMIT 1
关于MySQL多表SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21614792/