gpt4 book ai didi

sql - 优化一个麻烦的查询

转载 作者:行者123 更新时间:2023-11-29 02:36:15 26 4
gpt4 key购买 nike

我正在通过 php 从 2 个 mysql 表生成一个 PDF,其中包含一个表。在较大的表上,脚本会占用大量内存并开始成为问题。

我的第一个表包含“检查”。每天有很多行。这与用户表具有多对一关系。

表“检查”


ID 区域 检查日期 inpsection_agent_1 inpsection_agent_2 inpsection_agent_3

ID(整数)
area (varchar) - 是 8 个“区域”之一,即:混凝土、土壤、土方工程
inspection_date (int) - unix 时间戳
inspection_agent_1 (int) - 用户 ID
inspection_agent_2 (int) - 用户 ID
inspection_agent_3 (int) - 一个用户 id


第二个表是用户的信息。我只需要将名称加入“inspection_agents_x”

ID 姓名

最终表格(将在 PDF 中)需要按以下方式组织数据:

  • 按天
  • 按用户,找出用户当天“巡查”过的每一个“区域”

混凝土土壤土方工程
1/18/2011
无名氏X
无名氏XX

每天依此类推。现在我只是对名称进行简单的连接,然后在代码端组织所有内容。我知道就查询而言,我在桌面上留下了很多东西,我只是想不出办法去做。

感谢您提供的所有帮助。

最佳答案

Select U.name
, user_inspections.inspection_date
, Min( Case When user_inspections.area = 'Concrete' Then 'X' End ) As Concrete
, Min( Case When user_inspections.area = 'Soils' Then 'X' End ) As Soils
, Min( Case When user_inspections.area = 'Earthwork' Then 'X' End ) As Earthwork
From users As U
Join (
Select area, inspection_date, inspection_agent1 As user_id
From inspections
Union All
Select area, inspection_date, inspection_agent2 As user_id
From inspections
Union All
Select area, inspection_date, inspection_agent3 As user_id
From inspections
) As user_inspections
On user_inspections.user_id = U.id
Group By U.name, user_inspections.inspection_date

这实际上是一个静态交叉表。这意味着您将需要知道在设计时应该在查询中输出的所有区域。

此查询有问题的原因之一是您的架构未规范化。您的检查表应如下所示:

Create Table inspections
(
id int...
, area varchar...
, inspection_date date ...
, inspection_agent int References Users ( Id )
)

这将避免内部 Union All 查询来获得您想要的输出。

关于sql - 优化一个麻烦的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4725245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com