MySQL多表SELECT

标签 mysql sql select subquery multiple-tables

我对组合 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/

相关文章:

mysql - 使用 MySQL 从字段中删除字符串

C# MVC ViewModel 返回 Null - 回传

sql - sql中ON子句和using子句的区别

php - 为什么查询不像 phpmyadmin 中那样返回显示名称?

php - 如何使用Angularjs在mysql中获取特定id的数据

java - 如何使用 Java 和 JDBC 将文本文件存储在 h2 数据库中?

php - 连接正忙于处理另一个 hstmt 错误的结果

sql-server - SQL SERVER 2008 Select 语句

php - 如何在mysql查询中创建自定义列的值

mysql合并一张表中的记录