mysql将多个查询分组

标签 mysql group-by subquery

我尝试解释一下这个问题: 我有一个用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 

但这是一次绝望的尝试,试图了解如何绕过它。

有什么帮助吗?有建议吗?

非常感谢

最佳答案

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 建议的那样,创建三个查询的 View ,这将使这个查询更加整洁

关于mysql将多个查询分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29436318/

相关文章:

scala 计数组结果

php - 使用 CI 事件记录的棘手 SQL 查询

MYSQL SELECT 可重复字段到列中

php - 使用什么来代替 EtherPad?使用 php 和 mySql

php - Codeigniter 将数据传递给相同的模型函数

来自 2 个表的带有计数的 SQL 查询

MySQL:如何使用子查询和连接选择 min()

MySQL 函数从查询传递参数

php - 检查产品是否已购买

MySQL SP 不返回结果?变量问题?