查询多个位置和同一行
Query with multiple where and same row
我想显示 学生 的数据,该学生具有多个角色(例如:英俊和聪明),如果学生不具备这两个角色或只有其中之一,则学生必须同时具备这两个角色然后字符 DONT SHOW.
我试过使用这个代码,但是所有包含字符(帅气和聪明)的数据都出现了
示例:
$data = DB::table('student')->whereIn('characters', ['handsome','smart'])->get();
您可以将 where 约束链接在一起,也可以向查询中添加 or 子句。 orWhere 方法接受与 where 方法相同的参数:
$users = DB::table('student')
->where('characters', 'handsome')
->orWhere('characters', 'smart')
->get();
针对此要求的工作原始 MySQL 查询类似于:
SELECT s1.*
FROM student s1
INNER JOIN
(
SELECT id
FROM student
WHERE character IN ('handsome', 'smart')
GROUP BY id
HAVING COUNT(DISTINCT character) = 2
) s2
ON s1.id = s2.id;
我们可以尝试编写如下Laravel代码:
$characters = DB::table('student')
->select('id')
->whereIn('characters', ['handsome','smart'])
->groupBy('id')
->havingRaw('COUNT(DISTINCT character) = 2');
$matches = DB::table('student s1')
->joinSub($characters, 's2', function ($join) {
$join->on('s1.id', '=', 's2.id');
})
->get();
此答案假定 student
table 的主键列称为 id
。如果它被称为其他名称,请更新我的代码片段以匹配它。
将此 where 子句放入您的查询中,如下所示:
$student = \DB::table('student')
->whereExists(function ($query) {
$query->orWhere('characters', 'handsome')
->orWhere('characters', 'smart');
})->get();
我想显示 学生 的数据,该学生具有多个角色(例如:英俊和聪明),如果学生不具备这两个角色或只有其中之一,则学生必须同时具备这两个角色然后字符 DONT SHOW.
我试过使用这个代码,但是所有包含字符(帅气和聪明)的数据都出现了
示例:
$data = DB::table('student')->whereIn('characters', ['handsome','smart'])->get();
您可以将 where 约束链接在一起,也可以向查询中添加 or 子句。 orWhere 方法接受与 where 方法相同的参数:
$users = DB::table('student')
->where('characters', 'handsome')
->orWhere('characters', 'smart')
->get();
针对此要求的工作原始 MySQL 查询类似于:
SELECT s1.*
FROM student s1
INNER JOIN
(
SELECT id
FROM student
WHERE character IN ('handsome', 'smart')
GROUP BY id
HAVING COUNT(DISTINCT character) = 2
) s2
ON s1.id = s2.id;
我们可以尝试编写如下Laravel代码:
$characters = DB::table('student')
->select('id')
->whereIn('characters', ['handsome','smart'])
->groupBy('id')
->havingRaw('COUNT(DISTINCT character) = 2');
$matches = DB::table('student s1')
->joinSub($characters, 's2', function ($join) {
$join->on('s1.id', '=', 's2.id');
})
->get();
此答案假定 student
table 的主键列称为 id
。如果它被称为其他名称,请更新我的代码片段以匹配它。
将此 where 子句放入您的查询中,如下所示:
$student = \DB::table('student')
->whereExists(function ($query) {
$query->orWhere('characters', 'handsome')
->orWhere('characters', 'smart');
})->get();