在同一查询中加入2个具有不同信息的MySQL表

时间:2014-09-03 00:52:45

标签: mysql

我在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

1 个答案:

答案 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