2010-09-25 94 views
0

我有兩個表 - countries,tours從一個表中獲取數據列表,並從另一個表中獲取一些記錄數,是否可以在一個查詢中執行?

countries具有字段(id),(name),(order

tours具有字段(id),(id_country)...


我需要得到整個列表idname從表countries按照它們的順序排列,並且記錄的計數在表tours中,其中toursid_country = countriesidcountries

也就是說,我需要得到這樣的名單

id name  count_of_tours 
1 France 15 
2 England 22 
............................. 

是否有可能在一個查詢呢?

感謝很多

回答

2
SELECT C.id, 
     C.name, 
     COUNT(T.id) as count_of_tours 
    FROM countries C 
    LEFT JOIN tours T 
     ON T.id_country = C.id 
GROUP BY C.id, 
      C.name 
ORDER BY C.order 
+2

@Symon - 當你使用諸如COUNT(),SUM,MAX()等等「集合函數」時,你需要在COUNT計算中指明表示中斷/重置的列,所以SQL知道計算所有T. id條目並顯示相對於第一個C.id和C.name的計數,然後將其內部計數器重置爲0,並在C.id/C.name更改時重新開始計數。 GROUP BY子句用於識別需要停止計算一個國家/地區的一組記錄的變更點,保留該結果,重置計數器並開始計算下一個國家的下一組記錄 – 2010-09-25 11:54:05

+0

非常感謝您的詳細解釋。這比許多教程要好得多:)但是爲什麼需要用兩個colomns對它們進行分組?與一個合作。 – Simon 2010-09-25 12:00:29

+0

@Symon - 最新的MySQL版本似乎足夠聰明地認識到,C.id和C.name來自於國家表中的記錄SAE,所以它不是關鍵在GROUP BY同時列出,但較早版本的MySQL和其他數據庫並不一定是聰明,或寬容......所以這是一個很好的習慣引用在GROUP所有的非聚集列BY ......這樣一來,如果你決定它不會突然中斷查詢使用Oracle或Postgres作爲數據庫,或者將其託管在運行早期版本MySQL的服務器上 – 2010-09-25 12:04:33

2
SELECT countries.id, countries.name, COUNT(id_country) AS Count 
FROM countries 
LEFT JOIN tours 
on tours.id_country = countries.id 
GROUP BY id_country 
ORDER BY countries.order 
+0

GROUP BY需要列出兩個非聚合列,但除此之外,你打我吧 – 2010-09-25 11:38:39

+0

我不知道有關GROUP BY,很高興知道!只使用mysql(接受它),我不得不知道其他數據庫不會接受它。謝謝 ! – 2010-09-25 12:28:01

0

這是真正的所有可能你需要學習的是加入的使用。當您使用連接時,您可以連接兩個表的結果並將輸出作爲一個輸出。

SELECT ID,姓名,COUNT(id_country)各國留下的countries.id JOIN上tours.id_country = countries.id爲了旅遊;

相關問題