如何将三个MySQL查询合并为一个?

3

使用wordpress数据库,我们拥有像wp_options和wp_postmeta这样的表。

它们按照主键ID分组,然后是像"option_name"和"option_value"这样的字段;

所以,例如要找到三个值,我需要执行3个不同的查询。

是否有一种正确的方法能够只通过一个查询完成所有这些操作?

请阐明并分享正确的做法。

SELECT option_value FROM bdlocal_wrdp1.wp_options WHERE option_name='siteurl';

SELECT option_value FROM bdlocal_wrdp1.wp_options WHERE option_name='blogname';

SELECT option_value FROM bdlocal_wrdp1.wp_options WHERE option_name='blogdescription';
<返回结果> (返回示例.com,示例博客,这是一个示例博客。)
4个回答

7
SELECT option_name,
       option_value
  FROM bdlocal_wrdp1.wp_options
 WHERE option_name IN ('siteurl', 'blogname', 'blogdescription')

在执行此查询之后,您将拥有3对 option_name + option_value 值。


谢谢你,zerkms!这比我以前做的要好得多。 - jaggedsoft

3
您可以使用IN子句来实现此功能。
SELECT option_value 
FROM bdlocal_wrdp1.wp_options 
WHERE option_name IN ('siteurl','blogname','blogdescription')

这将会很棘手,知道哪个值属于哪个选项。 - zerkms

1
select (case when option_name='siteurl' then option_value else 0 end ) as 'siteurl',
   (case when option_name='blogname' then option_value else 0 end ) as 'blogname',
   (case when option_name='blogdescription' then option_value else 0 end ) as 'blogdescription' from bdlocal_wrdp1.wp_options

0
您还可以使用 MySQL Union 来实现此功能:
select option_name,option_value from wp_options where option_name='siteurl' UNION ALL
select option_name,option_value from wp_options where option_name='blogname' UNION ALL
select option_name,option_value from wp_options where option_name='blogdescription';

您可以在这里阅读更多关于Union的信息和一些示例。


你为什么选择这个而不是使用 IN 呢?你的解决方案保证会更慢,长度会增加三倍,而且更难阅读。 - zerkms
一个只有数百万条记录的表对于这样一个琐碎的查询来说并不算什么。如果您检查了查询计划,您会发现这个查询做了更多的工作。您已经检查了查询计划吗?结果如何?如果没有 - 您的假设是基于什么的? - zerkms
问题在于我们必须针对表中的每个option_name运行此检查。--- 这肯定是错误的。 - zerkms
@zerkms:谢谢你纠正我,我研究了一下,你的方法大约快了两倍。你非常有知识,并且我很感激你指出这一点! - jaggedsoft
我建议检查EXPLAIN,仅运行时间并不具有代表性。 - zerkms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接