2017-02-21 63 views
1

我希望這是一個人一個簡單的問題, 我試圖讓屬於某一regionID用戶的計數獲得的行數。MYSQL - 從2個表

我有一個用戶表和場地表,我想匹配用戶區域和場館區域特定regionID。

例如

SELECT COUNT(*) FROM users 
LEFT JOIN venues 
ON users.region = venues.region 
WHERE venues.regionID = '18' 

我從各種嘗試的結果導致數以百萬計,爲1到無響應的頁面(大口)

實施例表中的數據:

用戶

userID = 1 
region = 'Brisbane' 

ve nues

venueID = 1 
region = 'Brisbane' 
regionID = '18'// which equates to Queensland 

感謝

+3

你要麼需要更清楚地說明你的目標了一下,還是向我們展示了一塊的原始數據集以及您期望的查詢最終返回的內容。就目前而言,您要完成的目標並不十分清楚。 – Santi

+0

那麼,你顯示的查詢工作?它輸出什麼?你爲什麼使用'LEFT JOIN'? 'users.region'包含的是什麼,它與'users.region'匹配嗎? –

+0

嗯我認爲這個問題是「屬於某個regionID的用戶數」,其餘的很不明確 – niceman

回答

1

我猜(不知道)你想不同用戶符合regionId標準的計數。

你可以這樣做。

SELECT COUNT(*) 
    FROM users 
WHERE region IN (SELECT region FROM venues WHERE regionID = '18') 

或者,您可以像這樣獲取每個區域中不同用戶的數量。

SELECT COUNT(DISTINCT users.userID) users, 
     region.regionID 
    FROM users 
    JOIN venues ON users.region = venues.region 
GROUP BY region.regionID 

我猜你有你的users表中的列userID

COUNT(*)可能不會在聯接中工作,因爲聯接操作的結果可能包含的行數不同於users表本身。

這是它有助於瞭解SQL很多,甚至可以指定你想要的結果的操作之一。幸運的是,DISTINCT關鍵字可以幫助將大量計數減少到更小和更有意義的計數。

爲了提高性能,您可能需要在(region, usersID)列的users表上添加複合索引。這個DDL查詢可能會爲你做。

 ALTER TABLE users ADD INDEX region_userID (region, usersID) 

而且,您的其他表,嘗試這兩個

 ALTER TABLE venues ADD INDEX regionID_region (regionID, region) 
     ALTER TABLE venues ADD INDEX region_regionID (region, regionID) 

閱讀:http://use-the-index-luke/

+0

感謝您的幫助。是的,用戶表上有一個用戶標識。 是的 - 不同的用戶匹配您的regionId標準的數量。那就對了。我將爲每個需要顯示計數的regionID使用這些select語句之一。 我的用戶表爲120,000行,場地爲3000。嘗試第一個代碼片段似乎超時了頁面。 我會嘗試其他代碼片斷。 謝謝 – Dmeter