【发布时间】:2015-04-03 16:48:41
【问题描述】:
我试着解释一下: 我有一个用 php+mysql 构建的酒店管理系统。 我需要提取的数量:
- 当前预订访客
- 来访者
- 离开的访客
我需要知道按“地区”分组的这些数字(地区是一个国家或国家的地区。我从存储的函数中获取此信息)。 我尝试了很多次,但我总是得到不符合我期望的值。
我尝试过按总和、按地区、按他们两个进行分组,我尝试过嵌套查询(可怕的结果……我不擅长子查询)。 以下是 3 个主要查询:
当前访问者:
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';
IFNULL 东西检查它是否应该显示国家代码或地区代码。
表'clienti'包含上面提到的IFNULL检查的地区或国家的值,它对分组子句很重要。
我的期望是这样的:
| region code | visitors present | visitors arriving | visitors leaving
------------------------------------------------------------------------
| 219 | 3 | 1 | 1 |
------------------------------------------------------------------------
| 186 | 2 | 0 | 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
但这是一次绝望的尝试,试图了解如何绕过它。
有什么帮助吗?有什么建议吗?
非常感谢
【问题讨论】:
-
您的三个单独的查询是否正常工作并为您提供所需的结果?你能显示这些查询的示例输出吗?
-
我会使用视图来解决您的问题。
-
@pala_ 是的,查询工作正常。这是一个例子或真实数据:
|245|3717|91|92|k| |1|NULL|NULL|-90|242|NULL|NULL|10|NULL|NULL|ngdz|NULL|NULL|N|NULL|NULL|NULL|2015-03-31 21:08:48||2015-04-01 08:38:03|1|Russia|NULL另一行|241|3629|92|92|k| |2|NULL|NULL|-35|137|NULL|NULL|10|NULL|NULL|mteq|NULL|NULL|N|NULL|NULL|NULL|2015-03-22 18:01:07|2015-03-29 20:13:51|1|Svizzera| -
你看到的每一行的第一个数字是区域代码(245和241)
标签: mysql group-by subquery nested-queries