Php 两个连接和两个计数得到拉拉威尔
在示例中,我有3个表。用户、语法、词汇 第一:Php 两个连接和两个计数得到拉拉威尔,php,mysql,laravel,eloquent,Php,Mysql,Laravel,Eloquent,在示例中,我有3个表。用户、语法、词汇 第一: 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
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行单词计数-正确,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
]
在这里,尝试以下方法。我删除了你的连接并使用了子查询 $selectString='users.*,从单词中选择count1,其中wl.user\u id=users.id为learned\u count'; $selectString=$selectString'从grammar_learned gl中选择count1,其中gl.user_id=users.id作为grammar_count'; $users=User::selectRaw$selectString->groupBy'users.id'->ORDERBYLERNED\U count,desc->get; 下面是它的直截了当的SQL。你有以下几点: 选择u.*,countwl.id作为单词\u cnt, countgl.if作为语法 来自用户u 连接单词 在wl.user_id=u.id上 加入语法学习小组 在gl.user_id=u.id上 按u.id分组 按单词顺序描述; 我基本上改成了这样: 选择u.*, 从单词中选择count1,其中wl.user\u id=u.id作为单词计数, 从grammar\u learned gl中选择count1,其中gl.user\u id=u.id作为grammar\u count 来自用户u 按u.id分组 按字数顺序描述;
当您将多个表连接在一起时,您将得到至少与所学单词的条件相匹配的行数。您能否在上面的问题中包含一个示例,说明返回的数据集当前的样子,以及您实际希望它的样子?这将使我们更容易弄清楚你到底想要什么。解决方案可能是使用子查询,也可能是选择列表列中的case语句。@gmiley thx,已更新我的问题