gpt4 book ai didi

php - 从表mysql中选择子记录

转载 作者:可可西里 更新时间:2023-11-01 08:45:33 24 4
gpt4 key购买 nike

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

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