У меня есть 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
]
При объединении нескольких таблиц вместе, вы будете в конечном итоге тянет по меньшей мере, количество строк, которые соответствуют критериям на 'words_learned'. Не могли бы вы включить образец того, как выглядит ваш возвращенный набор данных, а также то, что вы на самом деле хотите, чтобы оно выглядело в вашем вопросе выше? Это облегчит нам определение того, чего вы хотите. Решением может быть либо использование подзапросов, либо, возможно, оператор case в столбцах выбранного списка. – gmiley
@gmiley thx, обновил мой вопрос –