【问题标题】:Improve a query to populate a Treeview改进查询以填充树视图
【发布时间】:2015-09-11 10:27:45
【问题描述】:

我正在尝试对下面的数据库结构进行查询。

基本上,当 tbuser 表中的注册用户进入系统时,系统会在 tbuser_logger 表中生成一个元组(获取其 id)。然后,用户可以在 tbprojeto 表中创建一个项目。之后在 tbdataid 表中创建一个元组,其中保存了创建项目的 id 和之前在 tbuser_logger 表中创建的元组的 id,或者是当时登录的用户信息以及他正在使用的项目。

所有其他系统表,如 tbcliente、tbinstituições、tbcar、tbhome 等,都有一个指向 tbdataid 表的外键,因此每个记录的数据都会包含有关哪个项目和哪个用户的信息。

我正在尝试挂载 SQL 以将某个用户在项目中记录的所有数据带出项目。因此(只有两个表):

SELECT
    t1.datProj_Id,
    t2.projNome,
    t3.instNome,
    t4.cltNome
FROM
    tbdataid t1
    LEFT JOIN tbprojeto t2 ON (t1.datId = t2.projDat_Id)
    LEFT JOIN tbinstituicao t3 ON (t1.datId = t3.instDat_Id)
    LEFT JOIN tbcliente t4 ON (t1.datId = t4.cltDat_Id)
    LEFT JOIN tbuser_logger t5 ON (t1.datUsrLog_Id = t5.usrLogId)
    LEFT JOIN tbuser t6 ON (t5.usr_Id = t6.usrId)  
WHERE 
    (t1.datProj_Id = 12 AND t6.usrId = 8)
    OR (t1.datProj_Id IS NULL AND t6.usrId = 8)

我的查询带来了我想要的数据,因此在填充树视图之后。但是查询有很多元组null,这是正常的。那么如何改进或改进这个查询来简化树视图的构建呢?按照下面的结果:

如果我只有一个 datid 值,如“1”下方的图像,我将有很多重复的元组,数据库大小很小,给我带来大约 96k。我可以比较之前不放树视图重复结果,但是这是对 deplhi 中数据集的一个大查询。

【问题讨论】:

  • 您要解决什么问题?你说你得到了正常的结果,那么你对查询有什么样的改进?您现在在构建树视图时遇到了什么困难?
  • @RobKennedy 我想删除查询中的空元组以减小数据集大小。所以,我总是会在 projNome 列中有一个非空值,例如,很多 instNome 和 cltNome 非空值。
  • 这个问题和Delphi有什么关系? 100% 与 SQL 有关。
  • @KenWhite 是的,对此很抱歉,我将 delphi 标签思想放在一个清晰的查询中以填充树视图。当我只有唯一的 dataid 值时,我编辑了我的问题,显示了另一种情况。

标签: mysql join treeview mysql-workbench


【解决方案1】:

我看到您在 SQL 查询中使用了IS NULL,为什么不也插入一些IS NOT NULL?至少要完全删除所有NULL 结果行。

【讨论】:

  • 我去看看能不能用点IS NOT NULL
猜你喜欢
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
相关资源
最近更新 更多