优化 SQL 查询

2024-01-24

我目前正在开发一个内容管理系统,我想听听您对以下方面的想法:

我有一张桌子,page。我们假设它看起来像这样

ID | Title | Content
1  | Test  | This is a test

除此之外,我还有一个page_option表(这样我可以存储与页面相关的选项,但我不想有有限的选项列表 - 如果需要,模块可以将自己的选项添加到页面。)

The page_option表可能如下所示:

page_id | option_key  | option_value
1       | background  | red
1       | module1_key | chicken

现在要检索页面对象,我使用 Active Record 类执行以下操作(这是针对该问题的伪编码):

function get_by_id($page_id) {

 $this->db->where('id', $page_id);
 $page_object = $this->db->get('page');

 if($page_object->num_rows() > 0) {

   $page = $page_object->row();
   $this->db->where('page_id', $page_id);
   $options_object = $this->db->get('option');

   if($options_object->num_rows() > 0) {
     $page->options = $options_object->result();
   }

   return $page;

 }

 return $page_object->row();

}

我想知道的是,有没有一种方法可以在一个查询中执行此操作,以便选项键成为我的选择中的虚拟列,所以我会得到:

ID | Title | Content        | background | module1_key
1  | Test  | This is a test | red        | chicken

在我的结果中,而不是对每一行进行单独的查询。如果有 10,000 个怎么办? ETC。

提前谢谢了!


使用 EAV (实体-属性-值 http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model)模型中您将始终需要处理此类问题。由于查询的复杂性,它们的效率也不是很高(大多数查询都需要旋转)。

SELECT page_id,
  MAX(CASE WHEN option_key = 'background' THEN option_value END) background,
  MAX(CASE WHEN option_key = 'module1_key' THEN option_value END) module1_key,
  MAX(CASE WHEN option_key = 'module2_key' THEN option_value END) module2_key
FROM page_option
GROUP BY page_id

例如,给定此表:

| PAGE_ID |  OPTION_KEY | OPTION_VALUE |
|---------|-------------|--------------|
|       1 |  background |          red |
|       1 | module1_key |      chicken |
|       2 | module1_key |         duck |
|       3 | module1_key |          cow |
|       4 |  background |         blue |
|       4 | module2_key |        alien |
|       4 | module1_key |      chicken |

您将得到以下输出:

| PAGE_ID | BACKGROUND | MODULE1_KEY | MODULE2_KEY |
|---------|------------|-------------|-------------|
|       1 |        red |     chicken |      (null) |
|       2 |     (null) |        duck |      (null) |
|       3 |     (null) |         cow |      (null) |
|       4 |       blue |     chicken |       alien |

Fiddle here http://sqlfiddle.com/#!2/e78d0/1.

然后只需加入page表,就是这样:)我省略了该部分,以便将查询集中在分组本身上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优化 SQL 查询 的相关文章

  • zip 文件的校验和

    我目前正在开发一个工具 它上传一组文件 然后使用 md5 校验和将文件与上一批上传的文件进行比较 并告诉您哪些文件已更改 对于常规文件 这工作正常 但某些上传的文件是 zip 存档 即使其中的文件相同 它们几乎总是会发生变化 有没有一种方法
  • 截断 Mysql 表 Cron 作业?

    我在如何使用 cron 作业截断 Mysql 表时遇到了一些麻烦 无论我尝试什么 我似乎都无法让数据库清除表格 感谢您的帮助 mysql uderp example pexample hlocalhost Dexample e TRUNCA
  • 为什么这会返回资源 id #2? [复制]

    这个问题在这里已经有答案了 可能的重复 我如何从 PHP 中的 MySql 响应中 回显 资源 id 6 https stackoverflow com questions 4290108 how do i echo a resource
  • 在 Laravel 5 中截断表

    描述 我有一个充满测试数据的表 有时 我想清除它以获取新数据 我可以在 DBMS 应用程序中执行截断 例如MySQL 工作台 但我试图在我的应用程序中实现它 Goal 创建一个按钮 单击时截断数据库中的表 这是我的步骤 1 声明一条路线 R
  • 阻止注销页面后的后退按钮

    我有 php 注销页面 当用户单击注销链接时 请参阅此页面并重定向到索引页面 但是当单击后退按钮时 我会看到带有用户数据的上一页 当然 当我刷新页面时 我看不到以前的页面和数据 我在单击注销并单击后退按钮后检查了其他代码 drupal 但我
  • 负载平衡集群中的 PHP 会话 - 如何?

    好的 我得到了这个完全罕见的负载平衡 PHP 网站的独特场景 令人遗憾的是 它过去没有进行负载平衡 现在我们开始遇到问题 目前唯一的问题是 PHP 会话 当然 一开始没有人想到这个问题 因此 PHP 会话配置保留为默认值 因此 两台服务器都
  • 通过 facebook graph API 检索 facebook 用户的邮政编码

    我正在尝试使用 facebook graph API 检索用户的邮政编码 我正在使用以下代码 代码在php ini中 facebook new Facebook array appId gt APP ID secret gt APP SEC
  • gcc 没有小字符串优化吗?

    Most std string实现 包括 GCC 使用小字符串优化 例如 有一个answer https stackoverflow com a 21710033 2640636讨论这个 今天 我决定检查我编译的代码中的字符串在什么时候被移
  • 如何在 PHP 中使用 cURL 发出同时包含 GET 和 POST 参数的请求?

    其他人已经问过如何从 perl java bash 等执行此操作 但我需要在 PHP 中执行此操作 并且我没有看到任何已提出的专门与 PHP 相关的问题 或包含 PHP 的答案 My code ch curl init url curl s
  • 将 Google 信任徽章添加到 Magento

    我正在尝试将 Google Trust Badge 添加到我的 magento 商店 我尝试在 Magento 网站上搜索扩展程序 但找不到 我是否需要将以下代码粘贴到产品和结账页面 还是必须对其进行更改 如果有人能引导我走向正确的方向 我
  • Laravel 5 中的自定义验证器

    我正在将 Laravel 应用程序从 4 升级到 5 但是 我有一个自定义验证器 但无法运行 在L4中 我做了一个验证器 php文件并将其包含在全局 php using require app path validators php 我尝试
  • 使用 PHP 的 MySQL 连接字符串

    我正在尝试通过本地计算机连接到托管在我的服务器上的数据库 我的服务器有cPanel 11 它是一个典型的共享服务器 由CentOS提供支持 安装了PHP和MySQL 准确地说 我在同一台服务器上持有经销商帐户 我想在不同帐户或域之间访问数据
  • 如何在 OS X 上使用 OpenSSL 1.0.1 编译 PHP 5.5.19

    我已经安装了 OpenSSL 1 0 1j usr local ssl现在我尝试使用此版本的 OpenSSL 编译 PHP 5 5 19 这是我的配置过程 export CFLAGS arch x86 64 export CXXFLAGS
  • Sonata DateTimePickerType 类默认日期显示错误的日期时间格式

    我陷入困境 我不知道如何使用 sonata DateTimePickerType 类正确设置默认日期和时间 我尝试了不同的方法 但到目前为止 没有一种方法没有帮助 在下面的截图中 help 键显示正确的日期和时间 但是当我使用 dp 默认日
  • PHP 数组通过 JSON 转为 jquery 数组

    我有点困惑为什么以下不起作用 get php
  • 从支付网关重定向回时用户会话丢失

    我已将 Cyber source 配置为我的支付网关 我能够导航到 cybersource 并进行付款 并能够成功重定向回该网站 我也可以取消付款并重定向回我的网站 我收到来自支付网关的响应 但是 用户在从支付网关重定向回来时会被注销 我正
  • 如何使用 PHP 对字符串进行 rot13 处理?

    我有一个很大的 php 代码 我想手动对其进行编码和解码 我的问题是 php 代码里面有很多单引号和双引号 因此我在使用时出现错误str rot13 功能如下 那么正确的语法是什么以及如何使用下面的函数进行编码 str rot13 That
  • php curl 使用 GET 发送变量 奇怪的结果

    我正在尝试调用远程站点上页面中的网址 决定使用curl 在远程站点上 url 变量显示为 REQUEST Array var1 gt val1 amp var2 gt val2 amp var3 gt val3 被调用的url是 http
  • Laravel $request->file() 返回 null

    尝试在后端使用 Laravel 上传文件时遇到问题 Issue Laravel request gt file 方法返回 null Setup 我使用以下方法构建了一个 AJAX 请求超级代理人 https github com visio
  • MySQL 查询计算上个月

    我想计算上个月的订单总额 我收到了从当前日期获取当月数据的查询 SELECT SUM goods total AS Total Amount FROM orders WHERE order placed date gt date sub c

随机推荐

  • Rails 收集 JSON 数据并将其渲染到 Highcharts 图表中

    我正在尝试将标签传递到 x 轴上的 Highcharts 柱形图 目前 图表的工作方式是渲染数据 但 x 轴标签显示 0 1 2 3 等 这是没有任何可渲染内容时的默认值 注释 控制器 def dashboard data Note get
  • 从服务帐户获取访问令牌刷新错误:Google API 中的 invalid_grant

    我正在关注这个例子 https code google com p google api python client source browse samples service account tasks py https code goo
  • javax.ws.rs.client.Client如何配置readTimeOut?

    从com sun jersey api client Client to javax ws rs client Client如何配置客户端 FROM import com sun jersey api client Client Clien
  • 反向滚动

    我很难找到我想要完成的任务的解决方案 我正在尝试使用 JS 或其他库 来实现它 以便当用户在鼠标滚轮上向下滚动时 页面滚动的方式与通常相反 基本上 我希望首先看到页面的底部 当用户滚动时 我希望屏幕的顶部进入视图 我能找到的唯一例子是右列h
  • 具有大图像尺寸的 UIImage - 内存问题 - 崩溃

    我想加载并显示图像 jpg png 具有大尺寸 例如1800x1200 或 2000x1800 宽 x 高 如果我在 UIImageView 中显示如此大尺寸的图像 1800x1200 或 2000x1800 它也会消耗大量内存 并且应用程
  • 即使在 Ajax 页面中显式等待后,Selenium 也无法找到元素

    我正在尝试自动更新 Web 应用程序中的字段 因此登录后url不会改变 到目前为止 这是我的代码 from selenium import webdriver from selenium webdriver common keys impo
  • C++ 中的音频操作

    我希望这是发布此内容的正确位置 并且有人可以提供帮助 我是一名音乐技术学生 最近开始学习 C 因为了解一门编程语言对我的职业生涯有很大帮助 尤其是这种语言 因为它用于视频游戏行业 无论如何 进入主题 我想要创建一个程序 用 C 编写 让用户
  • 在 Python 中检查非常大的数字的素性

    检查给定的大数是否为素数的最快方法是什么 我说的是大小约为 10 32 的数字 我已经尝试过该算法 MarcoBonelli 的精彩回答 https stackoverflow com a 27946768 1195131这是 from m
  • 如何同步两个 Subversion 存储库?

    我公司有一家子公司 互联网连接速度很慢 我们的开发人员在与我们的中央交互时遇到了麻烦颠覆 http en wikipedia org wiki Subversion 28software 29服务器 是否可以为它们配置从属 镜像 他们将与服
  • 如何生成杠杆统计数据?

    我知道如何使用 leverPlot 生成图 但我找不到一种方法来为每个观察生成杠杆统计数据 就像 megastat 输出中一样 我认为您正在寻找帽子的价值 Use hatvalues fit 经验法则是检查任何比平均帽子值大 2 3 倍的观
  • Spring Data - 覆盖某些存储库的默认方法

    我只是盯着spring data and spring data rest我真的很想利用这些工具所提供的功能 在大多数情况下 基本功能非常适合我的用例 但在某些情况下 我需要对底层功能进行大量自定义 并有选择地分配一些存储库来继承我所追求的
  • 如何在Linux中使用RAW套接字发送802.11管理帧和数据帧

    我正在尝试构建一个应用程序 该应用程序将使用原始套接字从用户空间一起发送 802 11 管理帧和数据帧 我能够使用 sendto 函数发送数据帧 但我还需要发送管理帧 这让我陷入困境 有什么可能的方法吗 为了从无线接口发送管理 数据或任何类
  • 在初始化之前无法调用砌体上的方法;试图呼叫“摧毁”

    所以我尝试结合 jQuery Masonry 插件 来自 http masonry desandro com http masonry desandro com 使用 Modernizr 在低分辨率下消除砖石结构 以便我的 div 恢复到居
  • 更新到 android 8.0 oreo 后 install_failed_no_matching_abis 无法提取本机库 res=-113

    我的应用程序有问题 我使用三星 s8 我的应用程序运行良好 直到我更新到 android oreo 我卸载了我的应用程序并尝试再次运行 但出现错误 install failed no matching abis failed to extr
  • NPM 在 Windows 10 上启动时 NODE_PATH 引发错误

    我正在尝试通过以下方式构建 MEAN Todo 应用程序https github com michaelheng429 super mean stack https github com michaelcheng429 super mean
  • 如何限制 foreach 循环中迭代的元素数量?

    我有以下代码 foreach var rssItem in rss Channel Items 但只想要 6 个项目而不是所有项目 我该如何在 C 中做到这一点 只需迭代集合中的前 6 个 foreach var rssItem in rs
  • 如何使用Reactor框架2.x执行多线程map/reduce?

    我之前问过这个问题 https stackoverflow com questions 22844717 how do you execute map reduce operations with the reactor framework
  • 如何在一个 ggplot 中绘制 S&P 500 和苏富比时间序列?

    我正在使用 quantmod 包下载 S P 500 时间序列和苏富比股票 library zoo library tseries library quantmod library ggplot2 env1 new env getSymbo
  • VBox 共享文件夹中符号链接的 Windows 问题

    我在 Virtual Box 上有一个 Ubuntu 17 虚拟机 我的主机操作系统是 windows 8 1 我在主机和来宾操作系统之间创建了一个共享文件夹 现在 因为windows不支持symlinks https en wikiped
  • 优化 SQL 查询

    我目前正在开发一个内容管理系统 我想听听您对以下方面的想法 我有一张桌子 page 我们假设它看起来像这样 ID Title Content 1 Test This is a test 除此之外 我还有一个page option表 这样我可