Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 两个连接和两个计数得到拉拉威尔_Php_Mysql_Laravel_Eloquent - Fatal编程技术网

Php 两个连接和两个计数得到拉拉威尔

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

在示例中,我有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 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,已更新我的问题