【问题标题】:mysql grouping mre than one querymysql对多个查询进行分组
【发布时间】: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


【解决方案1】:
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 建议的那样,创建三个查询的视图,这会使这个更整洁

【讨论】:

  • 我认为我无法创建视图,因为您看到的数字(93、94、95)正在以编程方式更改。我想我应该最终创建一个程序。还是什么?
  • views 只会让这个查询更容易查看:)
  • 我正在尝试您的解决方案,但出现此错误:#1060 - Duplicate column name 'num_persone'
  • 我认为我们离目标更近了:)
  • 我以为你说你的查询有效?我只是复制粘贴在那里。让我编辑出我认为的错误。它要求 p.num_persone AND p.* 在每个子查询中。我删除了所有你似乎不感兴趣的列。现在试试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多