簡體   English   中英

從與第三個表相關的兩個表中獲取計算

[英]get calculation from two tables related with a third table

我有這張桌子

     table1
|  id  |  name  |
|  1   |  axe   |
|  2   |  bow   |
|  3   |  car   |
|  4   |  dart  |

這兩個表

        table2                                        table3
|  t1_id  |  number  |                        |  t1_id  |  letter  |
|  1      |  5       |                        |  1      |  a       |
|  1      |  6       |                        |  1      |  b       |
|  1      |  2       |                        |  1      |  c       |
|  2      |  2       |                        |  2      |  a       |
|  2      |  2       |                        |  2      |  c       |
|  2      |  3       |                        |  2      |  r       |
|  3      |  8       |                        |  3      |  y       |
|  3      |  3       |                        |  3      |  i       |
|  3      |  1       |                        |  3      |  a       |
|  4      |  8       |                        |  4      |  a       |
|  4      |  9       |                        |  4      |  b       |
|  4      |  10      |                        |  4      |  c       |

其中t1_idtable1 id

我想做的事是讓具有表3字母ABC和他們的人數像這樣為了通過letter_count DESC AVG的所有table1的記錄先然后由avg_numbers DESC

|  id  |  name  |  letter_count  |  avg_number   |
|  4   |  dart  |  3             |  9            |
|  1   |  axe   |  3             |  4.3333333333 |
|  2   |  bow   |  2             |  2.3333333333 |
|  3   |  car   |  1             |  4            |

我預期可以正常工作的查詢是http://www.sqlfiddle.com/#!9/69086b/3/0

SELECT 
  t1.id, 
  t1.name, 
  COUNT(t3.letter) AS letter_count, 
  AVG(t2.number) AS avg_number

FROM 
  table1 t1

INNER JOIN 
  table2 t2
    ON t2.t1_id = t1.id

LEFT JOIN 
  table3 t3
    ON t3.t1_id = t1.id
      AND t3.letter IN ('a', 'b', 'c')

GROUP BY
  t1.id

ORDER BY
  letter_count DESC,
  avg_number DESC

但數字完全不同且准確,但順序正確

我不想獲取letter_count和avg_number值,但我只想按它們排序,但它們的值讓我擔心查詢性能

我不會注意到這個怪異的值,因為我的實際查詢是

SELECT 
  t1.id, 
  t1.name

FROM 
  table1 t1

INNER JOIN 
  table2 t2
    ON t2.t1_id = t1.id

LEFT JOIN 
  table3 t3
    ON t3.t1_id = t1.id
      AND t3.letter IN ('a', 'b', 'c')

GROUP BY
  t1.id

ORDER BY
  COUNT(t3.letter) DESC,
  AVG(t2.number) DESC

只給我適當的秩序

|  id  |  name  |
|  4   |  dart  |
|  1   |  axe   |
|  2   |  bow   |
|  3   |  car   |

但是在檢查了值之后,我是否對letter_count感到驚訝, 是否只是忽略了這些值,這不會影響我的大表的性能?

您正在匯總兩個不同的維度。 這導致笛卡爾積。 解決此問題的一種方法是加入之前進行匯總:

SELECT t1.id, t1.name, t2.letter_count, t2.avg_number
FROM table1 t1 INNER JOIN 
     (SELECT t2.t1_id, AVG(t2.number) as avg_number
      FROM table2 t2
      GROUP BY t2.t1_id
     ) t2
     ON t2.t1_id = t1.id LEFT JOIN
     (SELECT t3.t2_id, COUNT(t3.letter) as letter_count
      FROM table3 t3
      WHERE t3.letter IN ('a', 'b', 'c')
      GROUP BY t3.t2_id
     ) t3
     ON t3.t1_id = t1.id
ORDER BY t3.letter_count DESC, t2.avg_number DESC;

在第三個表上,IN-SELECT子查詢。


SELECT 
  t1.id, 
  t1.name, 
  (
    SELECT count(letter)
    FROM  t3 
      where  t3.t1_id = t1.id
    ) as lettercount,
  AVG(t2.number) AS avg_number

FROM 
  table1 t1

INNER JOIN 
  table2 t2
    ON t2.t1_id = t1.id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM