我在3天内搜索过这个问题的解决方案,已经尝试了几十个查询,到目前为止没有工作...... :(
我有表格users
,我列出了那里有一个列user_type = 2
到目前为止一直很好......
然后我有了表feedback
,我想在同一个查询中输入用户列表和每个用户的平均反馈(知道有些用户没有反馈,因此甚至没有列出在反馈表中。)
到目前为止返回的唯一查询是这一个:
SELECT DISTINCT u.user_id, u.company_name, u.post_code, u.about_company, avg(fd.rating) AS rating FROM users u LEFT JOIN feedback fd ON fd.vendor_id = u.user_id WHERE u.user_type=2 ORDER BY u.user_id ASC
现在,在表格"反馈"目前只有一家公司有反馈意见。但是这个列表应该返回列为user_type = 2的所有用户,其中大约有20个左右。问题是,结果只有一家公司(当我仅列出公司时,列表中的第一家公司),但这甚至不是那些有反馈的公司,所以"评级"然后列被分配给错误的公司。
SOOO ......在所有这些混乱之后,我希望有人能理解我在寻找什么并且可以帮助我。 :)
EDIT1
我的users
表包含以下字段:user_id,company_name,post_code,about_company
我的feedback
表包含以下字段:feedback_id,job_id,vendor_id(与表用户的user_id相同),评级
EDIT2
好的,我试图保持这个简单!我的表有比这些更多的字段,我的查询实际上更复杂,因为它计算考虑纬度和经度的距离。这是真正的查询:
SELECT DISTINCT u.user_id, u.company_name, u.post_code, u.about_company, coalesce(avg(fd.rating),0) AS rating FROM users u LEFT OUTER JOIN feedback fd ON fd.vendor_id = u.user_id WHERE u.lat!='' AND u.longt!='' AND u.status!=0 AND u.user_type=2 AND SQRT( POW( 69.1 * ( u.lat - 38.7376772 ) , 2 ) + POW( 69.1 * ( -9.1269717 - u.longt ) * COS( u.lat / 57.3 ) , 2 ) ) < 100 ORDER BY u.user_id ASC
答案 0 :(得分:2)
听起来你需要一个左外连接。我假设您的架构看起来像这样:
create table users (user_id int, user_type int);
create table feedback (feedback_id int, user_id int, feedback_value int);
SELECT user_id, avg(feedback_value)
FROM users
LEFT OUTER JOIN feedback USING(user_id)
WHERE users.user_type=2
GROUP BY user_id
可能想要在那里抛出一个coalesce来返回零vs null
SELECT user_id, coalesce(avg(feedback_value),0) as average_feedback
FROM users
LEFT OUTER JOIN feedback USING(user_id)
WHERE users.user_type=2
GROUP BY user_id
这是一个有效的例子。
mysql> create database test_pedro;
Query OK, 1 row affected (0.00 sec)
mysql> use test_pedro;
Database changed
mysql> create table users (user_id int, user_type int);
Query OK, 0 rows affected (0.02 sec)
mysql> create table feedback (feedback_id int, user_id int, feedback_value int);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into users values (1,2), (2,2), (3,3);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> insert into feedback values (1,1,4), (2,1,19);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT user_id, coalesce(avg(feedback_value),0) as average_feedback
FROM users
LEFT OUTER JOIN feedback USING(user_id)
WHERE users.user_type=2
GROUP BY user_id;
+---------+------------------+
| user_id | average_feedback |
+---------+------------------+
| 1 | 11.5000 |
| 2 | 0.0000 |
+---------+------------------+
2 rows in set (0.00 sec)
mysql>
这是预期的输出吗?
这是您使用某些模式更新的查询。特别是删除DISTINCT并添加GROUP BY以使用AVG()函数
SELECT u.user_id,
u.company_name,
u.post_code,
u.about_company,
Coalesce(Avg(fd.rating), 0) AS rating
FROM users u
LEFT OUTER JOIN feedback fd
ON fd.vendor_id = u.user_id
WHERE u.lat != ''
AND u.longt != ''
AND u.status != 0
AND u.user_type = 2
AND Sqrt(Pow( 69.1 * ( u.lat - 38.7376772 ), 2 ) + Pow( 69.1 * ( -9.1269717 - u.longt ) * Cos( u.lat / 57.3 ), 2)) < 100
GROUP BY u.user_id,
u.company_name,
u.post_code,
u.about_company
ORDER BY u.user_id ASC