2016-08-03 77 views
0

我知道这个问题已经在这里问了很多次,但毕竟我找不到我想要的答案。mysql - 正确加入两个表作为一对多关系

我的问题是:

我有两个表,这些表的结构为:

表1: item_id, store,title,available,shipping

表2: item_id, review_rate,user_id,review_title

这些表格应该作为one to many关系加入。

例如,如果这些表中的数据是为:

table1: 

item_id  store  title available shipping 
------------------------------------------------------- 
11   glasses .......................... 
12   dresses .......................... 
. 
. 
. 

table2: 

item_id  review_rate user_id review_title 
-------------------------------------------------- 
11   3    10023  good item 
11   5    10024  nice item 
12   1    10024  nice one 
. 
. 
. 

那么结果应该尽可能接合后:

afterJoin: 

item_id store title available shipping rate people_reviewed 
----------------------------------------------------------------------- 
11  .................................... 4  2 
12  .................................... 1  1 

我试图加入的query是:

CREATE OR REPLACE VIEW afterJoin AS 
SELECT i.*,round(AVG(r.review_rate)) as rate,count(r.user_id) as people_reviewed 
    FROM table1 i 
    RIGHT JOIN table2 r ON i.item_id = r.item_id 

但这只返回一行。

+0

mysql不等于SQL-server – Jens

+0

谢谢你改进我的错误 –

+1

为什么你在这里使用正确的连接?为什么不是左连接?当您使用正确的连接时,即使table1中的行不存在,您也将获得所有评论。这可能是好的,但大多数人认为是另一个方向。你想要所有的项目和他们的评论(如果存在)。你有这种编码的方式,你不会得到一个项目,如果它没有审查返回。 –

回答

2

您的查询缺少GROUP BY子句。没有它,你的数据库将把所有的记录聚合在一起。

SELECT i.*, round(AVG(r.review_rate)) as rate, count(r.user_id) as people_reviewed 
FROM table1 i 
    RIGHT JOIN table2 r ON i.item_id = r.item_id 
GROUP BY i.item_id 

GROUP BY指示聚集为每个item_id分贝。

+0

谢谢你这一个解决了我的问题。这是你对我的欠债,你给我的问题的解决方案的重要时间 –

+0

很高兴我能帮上忙! –