php - 从表mysql中选择子记录

标签 php mysql

我得到了下面的一段 select 语句,它得到了 2 级子记录,有问题要更深入,谁能帮忙?

SELECT
  id_mobile AS ID_PROJETO,
  UM.qtd_UC,
  AM.qtd_AMBIENTE
FROM projetos_mobile AS PM
LEFT JOIN (
   SELECT
      COUNT(id) AS qtd_UC,
      projeto,
      data_hora_importacao,
      id_uc_mobile
   FROM ucs_mobile
   WHERE data_hora_importacao = '2015-05-15 17:21:02'
   GROUP BY projeto) AS UM
ON PM.id_mobile = UM.projeto
LEFT JOIN (
   SELECT
      COUNT(id_uc_mobile) AS qtd_AMBIENTE,
      id_uc_mobile
   FROM ucs_mobile
   LEFT JOIN (
      SELECT
         uc
      FROM ambientes_mobile AS s
      WHERE data_hora_importacao = '2015-05-15 17:21:02') AS G
   ON G.uc = ucs_mobile.id_uc_mobile
   WHERE data_hora_importacao = '2015-05-15 17:21:02') AS AM
ON UM.id_uc_mobile = AM.id_uc_mobile
WHERE PM.data_hora_importacao = '2015-05-15 17:21:02'

http://sqlfiddle.com/#!9/2eecf

如果有人想尝试解决方案,这里有一个 sqlfiddle。我有特定的层次结构:projeto>uc>ambiente>secao>medicoes

ucs_mobile.projeto refers to projetos_mobile.id_mobile
ambientes_mobile.uc refers to ucs_mobile.id_uc_mobile
secoes_iluminacao_mobile.ambiente refers to ambientes_mobile.id_ambiente_mobile

我需要为我传递的 parent 计算每个 child 的数量,我将有 5 个函数 返回给定 parent 的每个 child 的计数,例如,对于项目 parent 我应该有 count(ucs),count(ambientes),count(secoes),count(medicoes)

所以,希望大家能帮帮我。该数据库非常丑陋,但这就是我得到的。感谢任何帮助。

最佳答案

当您有像这样非常大的查询时,将它们单独分解、从头开始并将它们拼凑在一起通常会很有帮助。

我首先为每个 projetos_mobile 值获取每个 ucs_mobile 行的计数。您可以通过在相关行上连接两个表并使用 COUNT(DISTINCT um.id) 获取行数来实现。还有其他方法可以做到这一点,但这种特定方法将更好地扩展您的查询的其余部分:

SELECT pm.id, COALESCE(COUNT(DISTINCT um.id), 0) AS qty_uc
FROM projetos_mobile pm
LEFT JOIN ucs_mobile um ON um.data_hora_importacao = '2015-05-15 17:21:02' AND um.projeto = pm.id_mobile
GROUP BY pm.id;

COALESCE 函数将用于填充 0 计数。只要记得使用 DISTINCT 关键字,并按正确的 id 分组,就可以像这样添加子行:

SELECT 
  pm.id, 
  COALESCE(COUNT(DISTINCT um.id), 0) AS qty_uc, 
  COALESCE(COUNT(DISTINCT am.id), 0) AS qty_am,
  COALESCE(COUNT(DISTINCT sim.id), 0) AS qty_sim
FROM projetos_mobile pm
LEFT JOIN ucs_mobile um ON um.data_hora_importacao = '2015-05-15 17:21:02' AND um.projeto = pm.id_mobile
LEFT JOIN ambientes_mobile am ON am.data_hora_importacao = um.data_hora_importacao AND am.uc = um.id_uc_mobile
LEFT JOIN secoes_iluminacao_mobile sim ON sim.data_hora_importacao = am.data_hora_importacao AND sim.ambiente = am.id_ambiente_mobile
GROUP BY pm.id;

这是一个 SQL Fiddle例子。 注意我稍微更改了您的示例数据以确保我的查询按预期工作。

另外,附注。我注意到,随着你的进展,你一直在你的 WHERE 子句中使用相同的日期,所以我也只是在该日期加入了每个表,并确保在我的第一次加入中我寻找了指定的日期,这又会转移到其他表。

关于php - 从表mysql中选择子记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30356797/

相关文章:

php - 使用ajax和php从数据库中删除图像

sql - 如何在 MySQL 中生成一系列每小时平均值?

mysql - 使用具有两个条件的内连接更新表并复制两列

php - 无法添加数据或未在购物车中使用 $_SESSION 显示

mysql - LEFT JOIN 为 NULL 条件

php - 如何在php中使用id在数据库中创建重复值

php - 如何在 Opencart 中限制订单到购物车?

php - 如何向 str_to_date mysql 函数添加一些天数?

javascript - 为什么 PHP 文件不能正确读取 javascript?

php - curl 问题。 PHP 脚本未随叫随到