2016-05-15 2 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(); 

Я один ряд в моей таблице grammar_learned и 3 строки в words_learned таблицы, но запрос возвращает 3 строки (count) для 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

работает! большое спасибо! –

Смежные вопросы