【问题标题】:How to use multiple selects in same query without messing everything如何在同一个查询中使用多个选择而不弄乱一切
【发布时间】:2021-04-05 06:35:54
【问题描述】:

所以,我有这个问题

  SELECT nome_equipa,
  count(id_golo) AS golos_marcados FROM equipa,golo 
  WHERE golo.equipa_id_equipa = id_equipa 
  GROUP BY golo.equipa_id_equipa, nome_equipa ORDER BY count(id_golo)DESC

输出这个表

然后我有这个其他查询

SELECT nome_equipa,
       sum(CASE
               WHEN (resultado_visitado = resultado_visitante)
                    AND jogo.equipa_id_equipa = id_equipa
                    OR (resultado_visitante = resultado_visitado)
                    AND jogo.equipa_id_equipa1 = id_equipa THEN 1
               ELSE 0
           END) AS empates,
       sum(CASE
               WHEN (resultado_visitado > resultado_visitante)
                    AND jogo.equipa_id_equipa = id_equipa
                    OR (resultado_visitante > resultado_visitado)
                    AND jogo.equipa_id_equipa1 = id_equipa THEN 1
               ELSE 0
           END) AS vitorias,
       sum(CASE
               WHEN (resultado_visitado < resultado_visitante)
                    AND jogo.equipa_id_equipa = id_equipa
                    OR (resultado_visitante < resultado_visitado)
                    AND jogo.equipa_id_equipa1 = id_equipa THEN 1
               ELSE 0
           END) AS derrotas
FROM jogo,
     equipa
GROUP BY nome_equipa
ORDER BY vitorias DESC

输出这个:

我要做的就是将两列并排放置,没有错误。

试过了

select nome_equipa, count(id_golo) as golos_marcados,
sum(case when (resultado_visitado = resultado_visitante) and jogo.equipa_id_equipa = id_equipa or (resultado_visitante = resultado_visitado) and jogo.equipa_id_equipa1 = id_equipa  then 1 else 0 end ) as empates,
sum(case when (resultado_visitado > resultado_visitante) and jogo.equipa_id_equipa = id_equipa or (resultado_visitante > resultado_visitado) and jogo.equipa_id_equipa1 = id_equipa  then 1 else 0 end ) as vitorias,
sum(case when (resultado_visitado < resultado_visitante) and jogo.equipa_id_equipa = id_equipa or (resultado_visitante < resultado_visitado) and jogo.equipa_id_equipa1 = id_equipa  then 1 else 0 end ) as derrotas
from jogo, equipa, golo
where golo.equipa_id_equipa = id_equipa
group by nome_equipa
order by vitorias desc

但它返回了这个:

这是ER图:

【问题讨论】:

  • 样本数据和逻辑解释真的很有帮助。
  • 请添加每个表的架构,并尽量避免使用葡萄牙语名称作为表,使用全英文作为标准是一个好习惯。

标签: php sql postgresql


【解决方案1】:

好的,很难用上述信息跟进逻辑,所以我不能给你你必须运行的确切查询。但是我可以建议如何到达它。

我建议使用 WITH 语句。 (https://www.postgresql.org/docs/9.1/queries-with.html)

喜欢的东西:

WITH goals AS (
        SELECT 
        nome_equipa,
        count(id_golo) as golos_marcados 
        FROM equipa, golo 
        WHERE golo.equipa_id_equipa = id_equipa 
        GROUP BY nome_equipa
     )

SELECT nome_equipa,
       g.golos_marcados,
       sum(CASE
               WHEN (resultado_visitado = resultado_visitante)
                    AND jogo.equipa_id_equipa = id_equipa
                    OR (resultado_visitante = resultado_visitado)
                    AND jogo.equipa_id_equipa1 = id_equipa THEN 1
               ELSE 0
           END) AS empates,
       sum(CASE
               WHEN (resultado_visitado > resultado_visitante)
                    AND jogo.equipa_id_equipa = id_equipa
                    OR (resultado_visitante > resultado_visitado)
                    AND jogo.equipa_id_equipa1 = id_equipa THEN 1
               ELSE 0
           END) AS vitorias,
       sum(CASE
               WHEN (resultado_visitado < resultado_visitante)
                    AND jogo.equipa_id_equipa = id_equipa
                    OR (resultado_visitante < resultado_visitado)
                    AND jogo.equipa_id_equipa1 = id_equipa THEN 1
               ELSE 0
           END) AS derrotas
FROM jogo      -- equipa TABLE IS NO NEEDED
LEFT JOIN goals g
ON goals.nome_equipa = jogo.nome_equipa
GROUP BY nome_equipa

然后你加入另一个查询和通过 nome_equipa 并添加列。就是这样。

【讨论】:

  • 对不起,我不明白接下来要做什么,你能看看我做了什么有助于理解吗?对帖子进行了一些修改
【解决方案2】:

如上所述,您可以使用withjoin 也会给你同样的结果:

select bla, lorum, ipsum from table1
join (select bla, bla1 from table 2) as select_row on select_row.bla = table1.bla

【讨论】:

  • 抱歉,没看懂。你能说在哪里使用上面的 with 吗?
【解决方案3】:

进入您的项目并不容易,如 Pato Navarro 所说,英语将是首选!

首先,您的查询结构可以改进,例如参见manual 关于FROM 子句和manual 关于window 函数。让我们尝试第一个查询(未测试!):

SELECT e.id_equipa
     , e.nome_equipa
     , count(*) AS golos_marcados
  FROM equipa AS e
 INNER JOIN golo AS g
    ON g.equipa_id_equipa = e.id_equipa 
 GROUP BY g.equipa_id_equipa
 ORDER BY golos_marcados DESC

让我们尝试第二个查询(未测试!):

SELECT e.id_equipa
     , e.nome_equipa
     , count(*) FILTER (WHEN j.resultado_visitado = j.resultado_visitante) AS empates
     , count(*) FILTER (WHEN (j.equipa_id_equipa = e.id_equipa AND j.resultado_visitado > j.resultado_visitante) OR (j.equipa_id_equipa1 = e.id_equipa AND j.resultado_visitante > j.resultado_visitado)) AS vitorias
     , count(*) FILTER (WHEN (j.equipa_id_equipa = e.id_equipa AND j.resultado_visitado < j.resultado_visitante) OR (j.equipa_id_equipa1 = e.id_equipa AND j.resultado_visitante < j.resultado_visitado)) AS derrotas
  FROM equipa AS e
  LEFT JOIN jogo AS j
    ON j.equipa_id_equipa = e.id_equipa     -- equipa plays at home
    OR j.equipa_id_equipa1 = e.id_equipa    -- equipa plays outside
 GROUP BY e.id_equipa
 ORDER BY vitorias DESC

如果两个查询都运行良好,那么您可以像这样将它们合并在一起(未经测试!):

WITH goal AS (
SELECT e.id_equipa
     , e.nome_equipa
     , count(*) AS golos_marcados
  FROM equipa AS e
 INNER JOIN golo AS g
    ON g.equipa_id_equipa = e.id_equipa 
 GROUP BY g.equipa_id_equipa
 ), result AS (
SELECT e.id_equipa
     , e.nome_equipa
     , count(*) FILTER (WHEN j.resultado_visitado = j.resultado_visitante) AS empates
     , count(*) FILTER (WHEN (j.equipa_id_equipa = e.id_equipa AND j.resultado_visitado > j.resultado_visitante) OR (j.equipa_id_equipa1 = e.id_equipa AND j.resultado_visitante > j.resultado_visitado)) AS vitorias
     , count(*) FILTER (WHEN (j.equipa_id_equipa = e.id_equipa AND j.resultado_visitado < j.resultado_visitante) OR (j.equipa_id_equipa1 = e.id_equipa AND j.resultado_visitante < j.resultado_visitado)) AS derrotas
  FROM equipa AS e
  LEFT JOIN jogo AS j
    ON j.equipa_id_equipa = e.id_equipa     -- equipa plays at home
    OR j.equipa_id_equipa1 = e.id_equipa    -- equipa plays outside
 GROUP BY e.id_equipa
)
SELECT g.id_equipa
     , g.nome_equipa
     , g.golos_marcados
     , r.empates
     , r.vitorias
     , r.derrotas
  FROM goal AS g
 INNER JOIN result AS r
    ON g.id_equipa = r.id_equipa
 ORDER BY g.golos_marcados DESC, r.vitorias DESC

在故事的最后,主要问题不是关于你的查询,而是关于你的表的结构:jogo表的resultado_visitado和resultado_visitante应该从表gojo中计算出来,否则你的数据可能是不一致!

【讨论】:

    猜你喜欢
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多