【问题标题】:see many status or create a table to store all status查看许多状态或创建一个表来存储所有状态
【发布时间】:2014-03-31 02:09:56
【问题描述】:

我有多个具有关系的表。 有时我需要做一个连接只是为了检查 status = true 并且查询很大并且有点混乱......

想知道如何在大型项目中处理这种情况。

当时正在考虑创建一个包含 parent 和 status 的表来对所有条件进行分组——在这种情况下,只需要一个简单的查询来检查这个关系状态是 true 还是 false。

像这样:

select *
from table
where table.parent in (select id from tableB where status = 1)
   or table.parent in (select id from tableC where status = 1)
   or table.parent in (select id from tableD where status = 1)

这是一个好方法吗? 从未测试过,也不知道在多大程度上是最好的解决方案

谢谢

【问题讨论】:

  • 您能否提供一些代码来解释您所指的内容?
  • 您应该使用该信息编辑问题,而不是将其放入评论中。
  • @PapaCharlie:如果你清楚status1,那为什么要in?只需致电where table.parent=1
  • 抱歉,忘记更改了,正确的是in (select id from tableB where status = 1),因为如果与 tabelaB 状态的关系成立,它会返回一个 id

标签: php mysql sql join relationship


【解决方案1】:

我有点困惑。您想重新设计您的数据结构,还是想优化您的查询?

没有明确的规范,我无法提供优化的数据结构。虽然这里有一些基于一些假设的优化建议。

  • 如果您的父 id 在表格之间没有重叠(即 tableb、tablec、tabled 没有共同的 id)您可以将状态字段移动到您的 'table' 表格中。
  • 如果他们共享一些 ID,那么以前的 ID 将不起作用。那么你可以使用Denormalization。将状态字段添加到 'table' 表格中,并在任何状态发生变化时使其保持最新状态。

如果您希望保留数据结构,则可以通过删除子查询并改用连接来优化查询。

在大多数情况下,JOIN 比子查询更快,而且子查询更快的情况很少见。

在 JOIN 中,RDBMS 可以创建一个更适合您的查询的执行计划,并且可以预测应该加载哪些数据以进行处理并节省时间,这与子查询不同,子查询将运行所有查询并将所有数据加载到进行处理。

子查询的好处是它们比 JOIN 更具可读性:这就是大多数 SQL 新手更喜欢它们的原因;这是简单的方法;但是在性能方面,JOINS 在大多数情况下会更好,即使它们也不难阅读。

【讨论】:

    【解决方案2】:

    您确实没有提供太多信息 - 甚至没有提出明确的问题:(

    建议:

    1) 首先关注您的数据设计

    2) 确保您的设计允许从数据中查询您需要的任何内容。例如,如果您需要按日期检查“状态”,请确保您有日期时间列。

    3) “优化”查询在游戏后期出现。首先确保您的查询是正确的,稍后再考虑“优化”。

    4) 调整数据库(例如,识别和实施索引)至关重要,应始终与 3) 结合使用

    '希望有帮助!

    PS:

    如果您有具体问题,请务必展示一些示例代码。

    【讨论】:

    • 感谢您的澄清。一些观察:1)一般来说,“连接”通常比子选择更好,2)考虑使用UNION,3)熟悉EXPLAIN PLAN,4)总是考虑如何/何时应用索引。
    猜你喜欢
    • 2020-08-14
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 2021-10-01
    • 1970-01-01
    • 2020-03-29
    相关资源
    最近更新 更多