mysql将mre分组为多个查询
我试图解释这件事: 我有一个用php+mysql构建的酒店管理系统。 我需要提取以下项目的数量: 当前预订访客 来访者 离开访客 我需要知道,按地区分组的数字要么是一个国家,要么是一个国家的一个地区。我从存储函数中获取此信息。 我尝试过很多次,但我总是得到与我期望的不一致的价值观 我试过按总和、按区域、按两个分组,我试过嵌套查询,结果很糟糕……我不太擅长子查询。 以下是3个主要问题: 现有访客:mysql将mre分组为多个查询,mysql,group-by,subquery,nested-queries,Mysql,Group By,Subquery,Nested Queries,我试图解释这件事: 我有一个用php+mysql构建的酒店管理系统。 我需要提取以下项目的数量: 当前预订访客 来访者 离开访客 我需要知道,按地区分组的数字要么是一个国家,要么是一个国家的一个地区。我从存储函数中获取此信息。 我尝试过很多次,但我总是得到与我期望的不一致的价值观 我试过按总和、按区域、按两个分组,我试过嵌套查询,结果很糟糕……我不太擅长子查询。 以下是3个主要问题: 现有访客: select p.num_persone, IFNULL(getcoderegione(c.regi
select p.num_persone, IFNULL(getcoderegione(c.regione),getNazioneCodeIstat(c.nazione)) regione, p.*, c.nazione, c.regione from prenota2015 p INNER JOIN clienti c ON c.idclienti = p.idclienti where p.iddatainizio < 94 and p.iddatafine >= 93 and p.idclienti != '0';
select p.num_persone, IFNULL(getcoderegione(c.regione),getNazioneCodeIstat(c.nazione)) regione, p.*, c.nazione, c.regione from prenota2015 p INNER JOIN clienti c ON c.idclienti = p.idclienti where p.iddatainizio < 94 and p.iddatainizio >= 93 and p.idclienti != '0';
select p.num_persone, IFNULL(getcoderegione(c.regione),getNazioneCodeIstat(c.nazione)) regione, p.*, c.nazione, c.regione from prenota2015 p INNER JOIN clienti c ON c.idclienti = p.idclienti where p.iddatafine < 93 and p.iddatafine >= 92 and p.idclienti != '0';
等等。
提问时间:我愿意你做吗
我上次试过:
SELECT DISTINCT
IFNULL(getcoderegione(c.regione),getNazioneCodeIstat(c.nazione)) regione,
pres.presenze,
part.partenze,
arr.arrivi
FROM
(
select COUNT(p.idprenota) partenze, p.idclienti
from prenota2015 p
INNER JOIN clienti c ON c.idclienti = p.idclienti
where
p.iddatafine < 91
and p.iddatafine >= 90
GROUP BY regione
) as part,
(
select COUNT(p2.idprenota) arrivi, p2.idclienti
from prenota2015 p2
INNER JOIN clienti c ON c.idclienti = p2.idclienti
where
p2.iddatainizio < 91
and p2.iddatainizio >= 90
GROUP BY regione
) as arr,
(
select COUNT(p3.idprenota) presenze, p3.idclienti
from prenota2015 p3
INNER JOIN clienti c ON c.idclienti = p3.idclienti
where
p3.iddatainizio < 91
and p3.iddatafine >= 90
GROUP BY regione
) as pres,
clienti c
但这是一次绝望的尝试,试图了解如何绕过它
有什么帮助吗?建议
多谢各位
SELECT q1.regione,
q1.total AS current_visitors,
q2.total AS arriving_visitors,
q1.total AS leaving_visitors
FROM (
SELECT sum(p.num_persone) total,
IFNULL(getcoderegione(c.regione), getNazioneCodeIstat(c.nazione)) regione
FROM prenota2015 p
INNER JOIN clienti c ON c.idclienti = p.idclienti
WHERE p.iddatainizio < 94
AND p.iddatafine >= 93
AND p.idclienti != '0'
GROUP BY regione
) q1
INNER JOIN (
SELECT sum(p.num_persone) total,
IFNULL(getcoderegione(c.regione), getNazioneCodeIstat(c.nazione)) regione
FROM prenota2015 p
INNER JOIN clienti c ON c.idclienti = p.idclienti
WHERE p.iddatainizio < 94
AND p.iddatainizio >= 93
AND p.idclienti != '0'
GROUP BY regione
) q2 ON q1.regione = q2.regione
INNER JOIN (
SELECT sum(p.num_persone) total,
IFNULL(getcoderegione(c.regione), getNazioneCodeIstat(c.nazione)) regione
FROM prenota2015 p
INNER JOIN clienti c ON c.idclienti = p.idclienti
WHERE p.iddatafine < 93
AND p.iddatafine >= 92
AND p.idclienti != '0'
GROUP BY regione
) q3 ON q1.regione = q3.regione;
或者,正如moo所建议的那样,创建三个查询的视图,这将使这一个查询更加整洁您的三个单独的查询是否正常工作并提供所需的结果?您能显示这些查询的示例输出吗?我会使用视图来解决您的问题。@pala_uuu是的,查询工作正常。以下是一个实例或真实数据的实例或真实数据:以下是一个实例或真实数据:以下是一个实例或真实数据:以下是一个实例或真实数据:以下是一个或一个或一个或一个或一个或一个实例或一个数据:以下是一个或一个或一个或一个或一个或一个或一个或一个或一个或一个或一个或一个或一个或一个或一个或一个或一个或一个或一个数据:数据:以下以下以下以下以下以下以下以下是一个或一个或一个或一个或一个或一个或一个或一个或一个或一个或一个或一个或一个或一个或一个或一个或一个或一个或一个或实际数据:数据:数据:数据::::124四四四四个或一个或一个或一个或一个或一个或一个或一个或一个或一个或| 92 | k | 2 | NULL | NULL |-35 | 137 | NULL | NULL | NULL | 10 | NULL | NULL | mteq | NULL | NULL | N | NULL | NULL | NULL | NULL | 2015-03-22 18:01:07 | 2015-03-29 20:13:51 |您看到的每一行的第一个数字是区域代码245和241。我想我无法创建视图,因为您看到的数字93、94、95正在以编程方式更改。我想我应该创建一个过程。或者什么?视图只会让这个查询更容易查看:我正在尝试你的解决方案,但我得到了这个错误:1060-重复的列名'num_persone'我想我们离目标更近了:我以为你说你的查询有效?我只是复制粘贴在那里。让我把我认为是错误的地方删掉。它在每个子查询中请求p.num_persone和p.*。我去掉了所有你似乎不感兴趣的专栏。现在试试
SELECT q1.regione,
q1.total AS current_visitors,
q2.total AS arriving_visitors,
q1.total AS leaving_visitors
FROM (
SELECT sum(p.num_persone) total,
IFNULL(getcoderegione(c.regione), getNazioneCodeIstat(c.nazione)) regione
FROM prenota2015 p
INNER JOIN clienti c ON c.idclienti = p.idclienti
WHERE p.iddatainizio < 94
AND p.iddatafine >= 93
AND p.idclienti != '0'
GROUP BY regione
) q1
INNER JOIN (
SELECT sum(p.num_persone) total,
IFNULL(getcoderegione(c.regione), getNazioneCodeIstat(c.nazione)) regione
FROM prenota2015 p
INNER JOIN clienti c ON c.idclienti = p.idclienti
WHERE p.iddatainizio < 94
AND p.iddatainizio >= 93
AND p.idclienti != '0'
GROUP BY regione
) q2 ON q1.regione = q2.regione
INNER JOIN (
SELECT sum(p.num_persone) total,
IFNULL(getcoderegione(c.regione), getNazioneCodeIstat(c.nazione)) regione
FROM prenota2015 p
INNER JOIN clienti c ON c.idclienti = p.idclienti
WHERE p.iddatafine < 93
AND p.iddatafine >= 92
AND p.idclienti != '0'
GROUP BY regione
) q3 ON q1.regione = q3.regione;