2016-08-03 9 views
0

Ich weiß, dass diese Frage schon oft hier gefragt, aber schließlich konnte ich meine Antwort nicht gefunden, was ich will.mysql - rechts verbinden zwei Tabellen als eine zu viele Relation

Meine Frage ist:

Ich habe zwei Tabellen und die Struktur dieser Tabellen ist als:

tabelle1: item_id, store,title,available,shipping

table2: item_id, review_rate,user_id,review_title

Diese Tabellen sollten als one to many Beziehung verknüpft werden.

Zum Beispiel, wenn die Daten in diesen Tabellen sind als:

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 
. 
. 
. 

dann sollte das Ergebnis sein, wie nach dem Beitritt:

afterJoin: 

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

Die query ich beizutreten versucht ist als:

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 

aber dies nur eine Zeile zurückgeben.

+0

mysql ist nicht gleich SQL-Server – Jens

+0

Vielen Dank, um meinen Fehler zu verbessern –

+1

Warum verwenden Sie ein Recht beitreten hier? Warum nicht eine Linke beitreten? Wenn Sie einen rechten Join verwenden, erhalten Sie alle Bewertungen, auch wenn die Zeile in Tabelle1 nicht vorhanden ist. Es ist möglicherweise in Ordnung, aber die meisten Leute denken die andere Richtung. Sie möchten alle Artikel und ihre Bewertungen (falls vorhanden). So wie Sie diesen Code haben, erhalten Sie keinen Artikel zurück, wenn er keine Überprüfung hat. –

Antwort

2

Ihre Abfrage fehlt eine GROUP BY Klausel. Ohne sie fasst Ihre Datenbank alle Datensätze zusammen.

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 

Die GROUP BY instruiert die DB für jede item_id zu aggregieren.

+0

danke dieser eine löste meine Frage. Das ist dir schuldig, dass du mir deine wichtige Zeit für die Lösung meiner Frage gibst –

+0

Froh ich könnte helfen! –

Verwandte Themen