我得到了下面的一段 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/