2016-06-17 2 views
1

私はstackoverflowがこの質問の答えを覚えていることを知っていますが、私は少し異なる状況があります。 2番目のテーブルにはたくさんのセルがありますが、SQLクエリは最初に取得されます。 OK、すべてのクエリではなく、WHEREタグのみ。他のテーブル値によってSQLクエリを注文する方法

例:
1テーブル

user_id = 1 
user_id = 2 

2テーブル

user_id = 1 | year = 2015 | rating = 55 
user_id = 1 | year = 2016 | rating = 10 
user_id = 2 | year = 2016 | rating = 50 
user_id = 2 | year = 2016 | rating = 5 

SQLクエリ:

$query = "SELECT c.*,v.upvotes 
     FROM ".PREFIX."_users c 
     LEFT JOIN (SELECT user_id,pol,vid_sporta,year_sport,category,SUM(rating) as upvotes 
     FROM ".PREFIX."_userrating 
     GROUP BY user_id 
     ) v 
     ON c.user_id = v.user_id 
     WHERE year_sport='2015' 
     ORDER BY upvotes DESC"; 

このクエリでは1人のユーザーしかいませんが、2015最初にと表示されます。

私は、

+0

'pol、vid_sporta、year_sport、category'フィールドの場所によっては、それらをグループ化せずに選択すると災害のレシピになります。 ...それはただ1つのレコードしか持っていません。グループのためにあなたのWHERE条件を満たす人は1人だけです; – Uueerdo

+0

あなたの期待する結果は? –

+0

ありがとう:)しかし、私は、このユーザーによって評価された1人のユーザーしかショーする必要はありません。 – Twelvee

答えて

1

多分問題のカップルが起こっていることを表示されます:)してくださいSQLクエリ:) ヘルプの一部の間のサイクルを必要としています。

SELECT user_id,pol,vid_sporta,year_sport,category,SUM(rating) as upvotes 

があるべき

まず、

SELECT user_id,SUM(rating) as upvotes 

あなたが唯一のあなたは、クエリの残りの部分に戻ってきているカラムと集約関数の離れていない任意の列を含めますあなたのGROUP BY声明にも現れなければなりません。

次に、あなたのWHERE year_sport = '2015'の場所は1レコードしか取得できないことがあります。 where条件が外部クエリにあるため、LEFT JOININNER JOINとして扱い、year_sportuserratingに含むすべての結果に限定します。 whereステートメントを内側のクエリに移動すると、すべてのユーザーを取得する必要がありますが、upvotesからyear_sport =2015までしか取得できません。

$query = "SELECT c.*,v.upvotes 
     FROM ".PREFIX."_users c 
     LEFT JOIN (SELECT user_id,SUM(rating) as upvotes 
     FROM ".PREFIX."_userrating 
     WHERE year_sport='2015' 
     GROUP BY user_id 
     ) v 
     ON c.user_id = v.user_id 
     ORDER BY upvotes DESC"; 
+0

Omg、tyそんなに! – Twelvee

+0

ユーザーごとにyear_sport = '2015'という評価が1つしかないことが分かっている場合は、関数またはグループを集計する必要はありません。複数年を含む場合や重複したレコードがある場合にはより安全ですが、試してみると「SUM(rating)AS upvotes」を「upvotesとして評価」に変更し、group by節を削除することができます – Matt

+0

OK、もう一度ありがとう:) – Twelvee

関連する問題