2017-02-21 66 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