2016-05-15 21 views
1

我有3个例子中的表。用户,grammar_learned,words_learned两个连接和两个计数得到laravel

第一:

CREATE TABLE grammar_learned 
(
    id INT(10) UNSIGNED PRIMARY KEY NOT NULL, 
    grammar_id INT(11) NOT NULL, 
    user_id INT(11) NOT NULL, 
); 

CREATE TABLE words_learned 
(
    id INT(10) UNSIGNED PRIMARY KEY NOT NULL, 
    word_id INT(11) NOT NULL, 
    user_id INT(11) NOT NULL, 
); 

CREATE TABLE users 
(
    id INT(10) UNSIGNED PRIMARY KEY NOT NULL, 
    name VARCHAR(255) NOT NULL, 
); 

而且我的查询:

$users = User::leftJoin('words_learned', 'users.id', '=', 'words_learned.user_id') 
      ->leftJoin('grammar_learned', 'users.id', '=', 'grammar_learned.user_id') 
      ->selectRaw('users.*, count(words_learned.id) as learned_count, count(grammar_learned.id) as grammar_count') 
      ->groupBy('users.id')->orderBy("learned_count", "desc")->get(); 

我有1分排在我的表grammar_learned和3行中words_learned表,但查询返回3行(计数)为words_learned - 正确和3行为grammar_learned(必须返回1)。我不明白为什么,请大家帮忙

不久: 我想这样的结果:

0 => array:4 [▼ 
    "id" => 1 
    "name" => "username" 
    "learned_count" => 3 
    "grammar_count" => 1 
    ] 

,但我得到

0 => array:4 [▼ 
    "id" => 1 
    "name" => "username" 
    "learned_count" => 3 
    "grammar_count" => 3 
    ] 
+0

当你加入多个表一起,你要结束了,至少拉动符合条件的行数'words_learned'。你可以包括你的返回数据集目前的样子,以及你真正希望它看起来像你的问题上面的样本?这将使我们更容易找出你想要的东西。解决方案可能使用子查询,也可能是在选择列表列中使用case语句。 – gmiley

+0

@gmiley thx,已更新我的问题 –

回答

2

这里,请尝试以下操作。我删除了你的连接,并使用子查询来代替...

$selectString = 'users.*, (select count(1) from words_learned wl where wl.user_id = users.id) as learned_count, '; 
$selectString = $selectString . '(select count(1) from grammar_learned gl where gl.user_id = users.id) as grammar_count '; 
$users = User::selectRaw($selectString)->groupBy('users.id')->orderBy("learned_count", "desc")->get(); 

下面是直出的SQL。你有以下几点:

select u.*, count(wl.id) as word_cnt, 
     count(gl.if) as grammar_cnt 
from Users u 
join words_learned wl 
on wl.user_id = u.id 
join grammar_learned gl 
on gl.user_id = u.id 
group by u.id 
order by word_cnt desc; 

这我基本上改成这样:

select u.*, 
     (select count(1) from words_learned wl where wl.user_id = u.id) as word_count, 
     (select count(1) from grammar_learned gl where gl.user_id = u.id) as grammar_count 
from users u 
group by u.id 
order by word_count desc; 
+0

工作!非常感谢! –